【算法学习day10】

力扣202.快乐数

链接: link

思路

这道题可能会遇到无限循环的情况,如何跳出循环是关键,我们可以用哈希表快速查询是否重复出现之前遇到的结果来结束循环。
另外对数字的拆解也是解这道题的关键,下面来看题解吧。

解:

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set1 = new HashSet<>();
        while (n != 1 && !set1.contains(n)) {
            set1.add(n);
            n = getN(n);
        }
        return n == 1;
    }

    private int getN(int n) {
        int sum = 0;
        while (n > 0) {
            int temp = n % 10;
            sum += temp * temp;
            n /= 10;
        }
        return sum;
    }
}

力扣1.两数之和

这道题的思路解释是借鉴了卡神的思路

思路:

这道题也是需要不断遍历数组,用两个for循环暴力求解就可以了,但是还有更好的办法就是使用哈希表。在用哈希表做这道题之前有四个问题:
1.为什么会想到用哈希表?
2.哈希表为什么用map?
3.本题map用来存什么?
4.map的key,value用来表示什么?
关于上面的四个问题的解答:
1.当我们要查询一个元素是否出现过,或者是否存在在集合中的时候,第一时间会想到哈希表。这道题我们需要一个集合去存放遍历的元素,在遍历数组的时候去访问这个集合,某个元素是否遍历过。
2.这道题不仅需要知道某个元素是否遍历过,还需要获得这个元素的下标,因此会想到使用map。将元素值和它的下标存放在map中。为什么不用数组或者set呢?因为数组大小受限,如果元素很少而哈希值过大会导致内存浪费。那又为什么不用set呢?因为set只能存放元素值,而这道题除了需要元素值,还需要它的下标。
3.在经过2问的解答后,想必你已经知道了map用来存什么内容,就是元素值和下标。
4.这道题我们给出一个元素,判断这个元素是否出现过,如果出现过则返回它的下标,要判断是否出现过,则需要将元素值作为key,自然它的下标就作为value。所以 map中的存储结构为 {key:数据元素,value:数组元素对应的下标}。
所以在遍历数组的时候,首先设置一个temp,temp值为target-当前遍历的元素,然后需要在map中查询是否存在temp,如果有,则找到配对,如果没有,就进入下一轮遍历。

解1:

链接: link

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        if (nums == null || nums.length == 0) {
            return res;
        }
        Map<Integer, Integer> maap = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int temp = target - nums[i];
            if (maap.containsKey(temp)) { // maap中查找是否包含temp
                res[0] = i;
                res[1] = maap.get(temp); // temp对应的index
                break;
            }
            maap.put(nums[i], i); // 将当前元素作为key,索引作为value加入maap
        }
        return res;
    }
}

解2:

public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> indexMap = new HashMap<>();
    
    for(int i = 0; i < nums.length; i++){
        int balance = target - nums[i];  // 记录当前的目标值的余数
        if(indexMap.containsKey(balance)){  // 查找当前的map中是否有满足要求的值
            return new int []{i, indexMap.get(balance)}; //  如果有,返回目标值
        } else{
            indexMap.put(nums[i], i); //  如果没有,把访问过的元素和下标加入map中
        }
    }
    return null;
}

你可能感兴趣的:(算法,学习)