代码随想录第七天|454.四数相加II、383. 赎金信、15. 三数之和

(本文主要是用于个人笔记的书写,很多地方的使用可能并不专业,如需学习更加建议移步代码随想录官网代码随想录 (programmercarl.com)

一、四数相加II

第一看有一点懵,但是看了基本的文字分析后将数组两两合并统计,用hashmap判断,做起来也没毛病(其实了解了思路之后还是蛮简单的啦~~)

  public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
    //四个可变量---》用哈希map将复杂度降低为n的平方
        HashMap<Integer,Integer> hsm = new HashMap<Integer,Integer>();
        int count =0;
        for(int i = 0 ;i<nums1.length;i++){
            for(int j = 0; j<nums2.length;j++){
                int all = nums1[i]+nums2[j];
                if(hsm.containsKey(all)){
                    int xin = hsm.get(all)+1;
                    hsm.put(all,xin);
                }else{
                    hsm.put(all,1);
                }
            }
        }
        for(int i = 0;i<nums3.length;i++){
            for(int j =0;j<nums4.length;j++){
                int all =nums3[i]+nums4[j];
                int need = -all;
                if(hsm.containsKey(need)){
                    int have =hsm.get(need);
                    count=count+have;
                }
            }
        }
        return count;
    }

-----》但是其中的时间复杂度有n平方,所以看看有没有更好的方法

二、383. 赎金信

好简单啊这种能用哈希数组做的题目,我竟然能一遍嘎嘎过

----》涉及到string然后关于26个字母的题目哈希数组就是吴迪的好吧

public boolean canConstruct(String ransomNote, String magazine) {
        //这道题和前面的题目蛮像的诶
        int[] hasarry = new int [26];//存放26个字母
        for(int i =0; i<magazine.length();i++){
            hasarry[magazine.charAt(i)-'a']++;
        }

        for(int i =0;i<ransomNote.length();i++){
            if(hasarry[ransomNote.charAt(i)-'a'] ==0 ){
                return false;
            }else{
                hasarry[ransomNote.charAt(i)-'a']--;
            }
        }
        return true;
    }

三、15. 三数之和

---反正就是做不出来...需要先看视频,

看完视频后自己也尝试写了一下,但写起来还是很麻烦 

   public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        int left =0; int right =0;
        int count = 0;

        for(int i =0;i<nums.length;i++){
             if (nums[i] > 0) {
                return result;
            }
            left =i+1;
            right=nums.length-1;
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            while(left<right){
                int rollleft = nums[left];
                int rollright = nums[right];
                if(nums[i]+nums[left]+nums[right]>0){
                    right--;
                }else if(nums[i]+nums[left]+nums[right]<0){
                    left++;
                }else{
                    
                     result.add(Arrays.asList(nums[i], nums[left], nums[right]));
                      left++;right--;         
               if(left<right){           
                       if(rollleft==nums[left]||rollright==nums[right]){
                         count--;
                     result.remove(Arrays.asList(nums[i], nums[left], nums[right]));
                }
                }   
                }
            }
        }
        return result;
    }
}

-------当时我的思路是既然有些值多添加到了list里面,那么就把他筛出来就行了,然后我再每次添加后还加了一个remove操作来排出重复添加的集合。但很显然,对于集合的重复填进去又拿出来是很麻烦的,所以要尽力避免其中的操作

---》代码随想录的操作直接就避免了其中的操作。直接进行判断跳过,可以舍去不断的重复操作

      while (right > left && nums[right] == nums[right - 1]) right--;
                   while (right > left && nums[left] == nums[left + 1]) left++;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值