day7:● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和

今天花的时间多了一点,今天的题也比昨天难了一点,也让我感觉到了自己对哈希还不够熟练,不过做完了题目感觉已经是更进一步了。

454.四数相加II 

建议:本题是 使用map 巧妙解决的问题,好好体会一下 哈希法 如何提高程序执行效率,降低时间复杂度,当然使用哈希法 会提高空间复杂度,但一般来说我们都是舍空间 换时间, 工业开发也是这样。

题目链接/文章讲解/视频讲解:代码随想录

四数相加||比起四数之和简单了很多,因为四数相加||每个数在不同的数组中,不太需要去重。方法也简单先将两两数组中所有组合统计起来,在将这些组合相加判断是否有符合的数组。

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer,Integer> map=new HashMap<Integer,Integer>();
        int all=0;
        for(int i:nums1)
        for(int j:nums2)
        map.put(i+j,map.getOrDefault(i+j,0)+1);
        for(int i:nums3)
        for(int j:nums4)
        all+=map.getOrDefault(0-i-j,0);
        return all;
    }
}

383. 赎金信  

建议:本题 和 242.有效的字母异位词 是一个思路 ,算是拓展题 

题目链接/文章讲解:代码随想录

这道题目和242.有效的字母异位词 (opens new window)很像 ,或者说它们的解法也很相似一般来说会了其中一个另有一个也就会了。

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        int[] hash=new int[26];
        for(int i=0;i<ransomNote.length();i++){
            hash[ransomNote.charAt(i)-'a']--;
        }
        for(int i=0;i<magazine.length();i++){
            hash[magazine.charAt(i)-'a']++;
        }
        for(int i:hash)
        if(i<0)
        return false;
        return true;

    }
}

 15. 三数之和 

建议:本题虽然和 两数之和 很像,也能用哈希法,但用哈希法会很麻烦,双指针法才是正解,可以先看视频理解一下 双指针法的思路,文章中讲解的,没问题 哈希法很麻烦。 

题目链接/文章讲解/视频讲解:代码随想录

三数之和难点在于去重复,三个数的去重导致了题目的复杂,一般对于比较麻烦的去重双指针都有很好的效果。

具体代码:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> list=new ArrayList<>();
        Arrays.sort(nums);
        for(int i=0;i<nums.length-2;i++){
            if(nums[i]>0){
                break;
            }
            if(i>0&&nums[i]==nums[i-1]){
                continue;
            }
            int left=i+1;
            int rigth=nums.length-1;
            while(rigth>left){
                if(nums[i]+nums[left]+nums[rigth]<0)
                left++;
                else if(nums[i]+nums[left]+nums[rigth]>0)
                rigth--;
                else{
                    list.add(Arrays.asList(nums[i],nums[left],nums[rigth]));
                    do{rigth--;}while(nums[rigth]==nums[rigth+1]&&rigth>left);
                    do{left++;}while(nums[left]==nums[left-1]&&left<rigth);

                }
            }
        }
        return list;
    }
}

 

18. 四数之和  

建议: 要比较一下,本题和 454.四数相加II 的区别,为什么 454.四数相加II 会简单很多,这个想明白了,对本题理解就深刻了。 本题 思路整体和 三数之和一样的,都是双指针,但写的时候 有很多小细节,需要注意,建议先看视频。 

题目链接/文章讲解/视频讲解:代码随sishuzhihe

四数之和和三数之和的核心思想一样只是在三数之和基础上在加上一层for循环原理一样。

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list=new ArrayList<>();
        Arrays.sort(nums);
        for(int last=nums.length-1;last>=3;last--){           
            if(last<nums.length-1&&nums[last]==nums[last+1])
            continue;
          for(int i=0;i<last-2;i++){           
            if(i>0&&nums[i]==nums[i-1]){
                continue;
            }
            int left=i+1;
            int rigth=last-1;
            while(rigth>left){
                long sum=(long)nums[i]+nums[left]+nums[rigth]+nums[last];//这里不能用int,int太小了
                if(sum<target)
                left++;
                else if(sum>target)
                rigth--;
                else{                                      
                    list.add(Arrays.asList(nums[i],nums[left],nums[rigth],nums[last]));
                    do{rigth--;}while(nums[rigth]==nums[rigth+1]&&rigth>left);
                    do{left++;}while(nums[left]==nums[left-1]&&left<rigth);

                }
            }
        }  
        }
        return list;
        
    }
}

记录

第七天完成,今天花的时间相对多了一点但是能有收获就是只得的,希望开学比赛的时候能有一战之力。

加油!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值