图解 LeetCode

177 阅读1分钟

前言

之前刷算法题,不懂的题目搞懂后,发现过一段实践再次刷还是做不出来,究其原因是因为没有深刻理解,所以萌生了用图记录下解题思路的想法,以帮助自己快速的定位问题和获取解题思路。在这里,会定时更新和记录一些算法的题解。

位运算

剑指 Offer 15. 二进制中1的个数

image.png

public class Solution {
    public int hammingWeight(int n) {
        int cnt = 0;
        while(n != 0){
            cnt++;
            n &= (n-1);
        }
        return cnt;
    }
}

剑指 Offer 56 - I. 数组中数字出现的次数

描述:前提:数组 nums 里除两个数字之外,其他数字都出现了两次;限制:要求时间复杂度是O(n),空间复杂度是O(1)。

  • 采用位运算 image.png
 class Solution {
    public int[] singleNumbers(int[] nums) {
        int z = 0, x = 0,y = 0,m = 1;
        for(int num : nums){
            z ^= num;
        }
        while((z & m) == 0){
            m <<= 1;
        }
        for(int num : nums){
            if((num & m) == 0){
                x ^= num;
            }else{
                y ^= num;
            }
        }
        return new int[]{x,y};
    }
}
  • 因为时间复杂度和空间复杂度的限制,所以不能用哈希表进行解决,但还是写下解决思路:
 class Solution {
    public int[] singleNumbers(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : nums) {
            int cnt = map.getOrDefault(num, 0);
            map.put(num, ++cnt);
        }
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
           if (map.get(nums[i]).equals(1)) {
              list.add(nums[i]);
           }
       }
       return list.stream().mapToInt(Integer::valueOf).toArray();
    }
}