写在前面

把LeetCode上的题目分类后,系统学习算法,分类来源

q1_两数之和

思路1

直接遍历两遍,找到答案直接返回。o(n²)
代码

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

思路2

利用hash的特性,少一次遍历。o(n)
代码

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

q387_字符串中的第一个唯一字符

思路

先遍历一遍s,把string转成存放char和其对应数量的map,然后在遍历s,找到第一个数量为1的char,如果没有返回-1。o(n)
代码

  public int firstUniqChar(String s) {
        Map<Character, Integer> map = new HashMap<>();
        char[] chars = s.toCharArray();
        for (char c : chars) {
            if (map.containsKey(c)) {
                map.put(c, map.get(c) + 1);
            } else {
                map.put(c, 1);
            }
        }
        for (int i = 0; i < chars.length; i++) {
            if (map.get(chars[i]) == 1) {
                return i;
            }
        }
        return -1;
    }

上述代码,可以做如下优化

            if (map.containsKey(c)) {
                map.put(c, map.get(c) + 1);
            } else {
                map.put(c, 1);
            }

            //优化为
             map.put(c, map.getOrDefault(c, 0) + 1);