1.两数之和

98 阅读1分钟

两数之和

我的解题

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int a = 0;
        int b = 0;
        tab: for(int i = 0;i < nums.length-1;i++){
            for(int j = i + 1;j < nums.length;j++){
                if(nums[i] + nums[j] == target){
                            a = i;
                            b = j;
                    System.out.println("[" + i + "," + j + "]");
                    break tab;
                }
            }
        }
        int[] num = {a,b};
        return num;
    }
}

参考的两种解决方案

1.暴力枚举

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

复杂度分析

时间复杂度:O(N^2),其中 N 是数组中的元素数量。最坏情况下数组中任意两个数都要被匹配一次。 空间复杂度:O(1)。

2.哈希表

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

复杂度分析

时间复杂度:O(N),其中 NN 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target - x。 空间复杂度:O(N),其中 NN 是数组中的元素数量。主要为哈希表的开销。

总结:第一次做算法题目,还是有很多不会的地方,还是要好好学习。