算法题:两数之和 简单

准备用java开始刷算法了…但有点暗了,但没事,俗话说:"一棵树种植的最好时机是二十年前,其次是现在 "。

两数之和

自己的解法:

class Solution {
    
    
    public int[] twoSum(int[] nums, int target) {
    
    
        int[] b= new int[2];
        int a = nums.length;
        for(int i=0;i<a-1;i++){
    
    
            for(int j=i+1;j<a;j++){
    
    
                if(nums[i]+nums[j]==target){
    
    
                    b[0]=i;
                    b[1]=j;
                }
            }

        }
        return b;
    }
}

优解

这些算法不看不知道,一看真的吓一跳,真的太棒了

class Solution {
    
    
public int[] twoSum(int[] nums, int target) {
    
    
    if(nums == null || nums.length < 2) {
    
    
        return new int[] {
    
    };
    }
    Map<Integer, Integer> map = new HashMap<>();
    int left = 0;
    int right = nums.length - 1;
    while(left <= right) {
    
    
        int ln0 = nums[left];
        int rn0 = nums[right];
        int ln1 = target - ln0;
        int rn1 = target - rn0;
        if(map.containsKey(ln1)) {
    
    
            return new int[] {
    
    left, map.get(ln1)};
        }
        else {
    
    
            map.put(ln0, left++);
        }
        if(map.containsKey(rn1)) {
    
    
            return new int[] {
    
    right, map.get(rn1)};
        }
        else {
    
    
            map.put(rn0, right--);
        }
    }
    return new int[] {
    
    };
}

}

这个算法利用了map,然后指定了左右的两个指针,两边同时开工,ln0为左边的第一个数,rn0为右边的第一个数, ln1和rn1是分别要取map中找的数据,如果map中包含了ln1和rn1的其中一个就直接可以返回结果了,如果没找到则左边的往左进一步则加1,右边的指针往右边走一步,则减1,至到left<=right结束。

总结

经过这道题,我觉得用map好爽呀,但我现在的固定思维就完全没有考虑过map,在以后的题中,我一定会把map这个思想加入到我的脑海中,还有两个左右指针同时开工,这也是非常好的思想。

猜你喜欢

转载自blog.csdn.net/please93/article/details/121488596
今日推荐