[leetCode 丶 20241129] 1. 两数之和

原题: 1.两数之和


描述:

描述


个人版答案

执行用时: 2 ms 执行内存消耗: 44.16 M

class Solution {
    public int[] twoSum(int[] nums, int target) {
        if(nums.length == 2 && (nums[0] + nums[1]) == target){
            return new int[]{0,1};
        }
        int[] res = new int[2];
        Map<Integer/* value */, Integer/* index */> map = new HashMap<>();
        for(int i = 0; i< nums.length;i++){
            int v= target - nums[i];
            Integer index = map.get(nums[i]);
            if(index == null){
                map.put(v, i);
            }else{
                return new int[]{i, index};
            }
        }
        return res;
    }
}

优秀解法

执行耗时: 0 ms

class Solution {
    public int[] twoSum(int[] nums, int target) {
        return twoSum2(nums,target);
    }
    private int[] twoSum2(int[] nums, int target) {
        HashMap<Integer,Integer> map = new HashMap();
        for(int i=0,j=nums.length-1;i<=j;i++,j--) {
            if(map.containsKey(target-nums[i])) {
                return new int[]{map.get(target-nums[i]),i};
            }
            map.put(nums[i],i);
            if(map.containsKey(target-nums[j])) {
                return new int[]{map.get(target-nums[j]),j};
            }
            map.put(nums[j],j);
        }
        return new int[0];
    }

}

个人解题思路与优秀答案解析

题目分析及个人版思路

  1. 第一题... 我寻思求和呗. 然后我就遍历了两两和...emmm...代码如下
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] soultion = new int[2];
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    soultion[0] = i;
                    soultion[1] = j;
                }
            }
        }
        return soultion;
    }
}

62ms...我看着前面的0ms..陷入了沉思.
2. 说起来也做了两周了吧? 要展示一下...冥思苦想...好好好...用target - 自己. 得到的结果放到map里.顺序遍历, 如果从结果中拿到了自己...那就取出下标. 因为题目限制了, 只有一个正确答案, 所以...嘿嘿, 上代码展示
3. 2ms...给自己一个赞

进阶版思路
果然我还是太嫩, 双向遍历...看到了...就等于学到了