Leecode.242 有效的字母异位词、349 两个数组的交集、202 快乐数、1 两数之和 | 代码随想录训练营第六天

Leecode.242 有效的字母异位词

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

思路

new一个字母表数组,从0-25依次代表a-z,数组的值代表s中出现的次数,统计完后再统计t中出现的次数相减,最后如果是有效的字母异位词,所有的值都应该为0。

解题方法

同思路

复杂度

  • 时间复杂度:

O(n)

  • 空间复杂度:

O(1)

Code

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] record = new int[26];
        for(int i = 0; i < s.length(); i++){
            record[s.charAt(i)-'a']++;
        }
        for(int i = 0; i < t.length(); i++){
            record[t.charAt(i)-'a']--;
        }
        for(int rec : record){
            if(rec != 0){
                return false;
            }
        }
        return true;
    }
}

Leecode.349 两个数组的交集

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

思路

看到输出结果中每个元素必须唯一,立刻想到HashSet,因为HashSet可以去重。

解题方法

先用HashSet将一个数组中的元素去重保存,再将判断另一个数组中的元素是否包含在HashSet中,如果包含,放入另一个HashSet当中,这里也用HashSet是因为结果也必须元素唯一。难点在于最后的HashSet转化为数组,这里使用了流,要背上来。

复杂度

  • 时间复杂度:

O(m+n)

  • 空间复杂度:

O(m+n)

Code

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        HashSet<Integer> set = new HashSet();
        HashSet<Integer> res = new HashSet();
        for(int num : nums1){
            set.add(num);
        }
        for(int num : nums2){
            if(set.contains(num)){
                res.add(num);
            }
        }
        return res.stream().mapToInt(x -> x).toArray();
    }
}

Leecode.202 快乐数

题目链接:快乐数

思路

快乐数并不快乐。。。在考虑如何取数值各个位上的单个数时思考了好久,,其实就是n%10,可以得到n的个位数,然后n=n/10去掉个位数再循环取余数,太精彩了!为了更加能够理清思路,可以将取单位数的方法提取出来单独作为一个方法,看起来简单明了。

解题方法

本题用到了HashSet,快乐数有可能是无限循环的,那么如何判断无限循环,就是看在计算快乐数过程中有没有出现重复数值,这样的话Set就派上用场了。

复杂度

  • 时间复杂度:

O(logn)

  • 空间复杂度:

O(logn)

Code

class Solution {
    public boolean isHappy(int n) {
        HashSet<Integer> set = new HashSet<>();
        while(n != 1 && !set.contains(n)){
            set.add(n);
            n = getNum(n);
        }
        return n == 1;
    }
    private int getNum(int n){
        int res = 0;
        while(n > 0){
            int temp = n % 10;
            res += temp*temp;
            n = n/10;
        }
        return res;
    }
}

Leecode.1 两数之和

题目链接:两数之和

思路

这道题由于是计算数组中两数之和是否为目标数,但是返回值却是要求返回数组两数的下标,因此要找到一个方法能够同时保存数组的值和下标,所以用HashMap来完成,这样比暴力解法少一个循环,时间复杂度降低。

解题方法

同思路

复杂度

  • 时间复杂度:

O(n)

  • 空间复杂度:

O(n)

Code

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++){
            int temp = target - nums[i];
            if(map.containsKey(temp)){
                result[0] = i;
                result[1] = map.get(temp);
                break;
            }
            map.put(nums[i], i);
        }
        return result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值