代码随想录-刷题第六天

242. 有效的字母异位词

题目链接:242. 有效的字母异位词

思路:哈希法。利用数组来记录出现的字母个数,然后判断是否为字母异位词。

时间复杂度:O(n)

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] count = new int[26];
        for (int i = 0; i < s.length(); i++) {
            // 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
            count[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            count[t.charAt(i) - 'a']--;
        }
        for (int i : count) {
            // record数组如果有的元素不为零0,
            // 说明字符串s和t一定是谁多了字符或者谁少了字符。
            if (i != 0) {
                return false;
            }
        }
        // record数组所有元素都为零0,说明字符串s和t是字母异位词
        return true;
    }
}

349. 两个数组的交集

题目链接:349. 两个数组的交集

思路:哈希法。利用HashSet集合来判断元素是否存在,set集合判断元素是否存在的时间复杂度为O(1)。注意,这里涉及将集合转换为int数组的操作。

时间复杂度:O(n)

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        // 存入set,然后遍历set
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> result = new HashSet<>();
        for (int num : nums1) {
            set1.add(num);
        }
        for (int num : nums2) {
            if (set1.contains(num)) {
                result.add(num);
            }
        }
        
        // 将结果集合转为数组
        // return result.stream().mapToInt(x -> x).toArray();

        int[] res = new int[result.size()];
        int i = 0;
        for(int num : result){
            res[i] = num;
            i++;
        }
        return res;
    }
}

202. 快乐数

题目链接:202. 快乐数

思路:哈希法加数值各个位上的单数操作,使用HashSet集合来检测是否循环。

时间复杂度:里面while循环的时间复杂度为O(logn),因为数字的位数由logn决定。

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        int sum = 0;
        while (n != 1) {
            // 取数值各个位上的单数平方之和
            while (n != 0) {
                sum += Math.pow(n % 10, 2);
                n = n / 10;
            }
            // 如果这个sum曾经出现过,说明已经陷入了无限循环了
            if (set.contains(sum)) {
                return false;
            }
            set.add(sum);
            n = sum;
            sum = 0;
        }
        return true;
    }
}

1. 两数之和

题目链接:1. 两数之和

思路:哈希法,使用HashMap集合key存放元素value存放下标,遍历一遍数组,判断Map集合中是否有符合条件的元素,如果有,返回两个元素的下标,每次判断结束要将当前元素值下标存放进Map集合。注意,为了防止当前元素也是符合条件的元素(即两个当前元素相加为目标值)导致的两个下标相同,所以要在判断结束之后再将当前元素和下标放进Map集合。

时间复杂度:O(n)

class Solution {
    public int[] twoSum(int[] nums, int target) {
        // 维护 val -> index 的映射
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            // 查表,看看是否有能和 nums[i] 凑出 target 的元素
            int need = target - nums[i];
            if (map.containsKey(need)) {
                return new int[]{map.get(need), i};
            }
            // 存入 val -> index 的映射
            map.put(nums[i], i);
        }
        return null;
    }
}

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值