首页 > 其他分享 >day7哈希表 454.四数相加II |383. 赎金信|15. 三数之和 |18. 四数之和

day7哈希表 454.四数相加II |383. 赎金信|15. 三数之和 |18. 四数之和

时间:2024-08-21 17:37:40浏览次数:4  
标签:四数 15 nums int day7 sum right return left

454.四数相加II

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        //前两数相加,key是合,次数是value,跟后两数相加的和等于0的话,就取出map里的次数。
        //两个for loop 时间复杂度n方。
        int res = 0;
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();

        for(int i: nums1){
            for(int j: nums2){
                int sum = i + j;
                if(map.containsKey(sum)){
                    map.put(sum, map.get(sum) + 1);
                }else{
                    map.put(sum, 1);
                }
            }
        }

        for(int i: nums3){
            for(int j: nums4){
                int sum =0 - i - j;
                if(map.containsKey(sum)){
                    res += map.get(sum);
                }
            }
        }
        return res;
    }
}

 

383. 赎金信

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        //注意java基本语法,写法。
        //用数组,跟242是同一个思路
        if(ransomNote.length() > magazine.length()){
            return false;
        }
        int[] record = new int[26];

        for(char c: magazine.toCharArray()){
            record[c - 'a']++;
        }
        for(char d : ransomNote.toCharArray()){
            record[d - 'a']--;
            if(record[d - 'a'] < 0){
                return false;
            }
        }
        return true;
    }
}

 

15. 三数之和

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        //先排序,然后三个指针,循环i,然后i之后的最左指针跟最右指针
        //重点是如何去重。for循环里的每个while 都是在去重复。
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);

        for(int i = 0; i < nums.length; i++){
            if(nums[i] > 0){
                return res;
            }
            if(i > 0 && nums[i] == nums[i - 1]){
                continue;
            }

            int left = i + 1;
            int right = nums.length -1;
            while(left < right){
                int sum = nums[i] + nums[left] + nums[right];
                if(sum > 0){
                    right--;
                }else if(sum < 0){
                    left++;
                }else{
                    res.add(Arrays.asList(nums[i], nums[left], nums[right]));
                }
                while(right > left && nums[right] == nums[right -1]){
                    right--;
                }
                while(right > left && nums[left] == nums[left + 1]){
                    left--;
                }
                right--;
                left++;
            }
        }
        return res;
    }
}

 

 

18. 四数之和 :两次剪枝导致无法AC.注释就好了

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list =new ArrayList<>();
        //排序
        Arrays.sort(nums);
        for(int i = 0; i < nums.length; i++){
            //第一次剪枝
            /*if(nums[i] > 0 && nums[i] > target){
                return list;
            }*/
            //第一次去重
            if(i > 0 && nums[i] == nums[i-1]){
                continue;
            }
            for(int j = i + 1; j < nums.length; j++){
                //第二次剪枝
                /*if(nums[i] + nums[j] > 0 && nums[i] + nums[j] > target){
                    return list;
                }*/
                //第二次去重
                if(j > i + 1 && nums[j] == nums[j-1]){
                    continue;
                }
                //通过左右指针找到元素c,d
                int left = j + 1;
                int right = nums.length -1;
                while(left < right){
                    long sum = (long)nums[i] + nums[j] + nums[left] + nums[right];
                    if(sum < target){
                        left++;
                    }else if(sum > target){
                        right--;
                    }else{
                        list.add(Arrays.asList(nums[i], nums[j], nums[left], nums[right]));
                        //第三次去重
                        while(left < right && nums[left] == nums[left+1]){ 
                            left++;
                        }
                        while(left < right && nums[right] == nums[right - 1]){
                            right--;
                        }
                        left++;
                        right--;
                    }
                }
            }
        }
        return list;
    }
}

 

标签:四数,15,nums,int,day7,sum,right,return,left
From: https://www.cnblogs.com/hewx/p/18372206

相关文章

  • leetcode面试经典150题- 3. 无重复字符的最长子串
    https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&envId=top-interview-150  packageleetcode150import"testing"funcTestLengthOfLongestSubstring(t*testing.T){s:=&qu......
  • 15 判断是否属于集合
    编一个程序,判断输入的字符申是否属于集合属于,输出'Y’,不属于,输出’N’例如:abbbdd,aaccd,abbcd,aaadddd是集合中的元素voidjudge(charstr[],intlength){if(str[0]!='a'||str[length-1]!='d'){printf("N");return;}intk=0;whi......
  • 【中项第三版】系统集成项目管理工程师 | 第 15 章 组织保障
    前言本章的知识点预计上午会考1-2分,下午可能会考,一般与其他管理领域进行结合考查。学习要以教材为主。目录15.1信息和文档管理15.1.1信息和文档15.1.2信息(文档)管理规则和方法15.2配置管理15.2.1基本概念15.2.2角色与职责15.2.3目标与方针15.2.4管理活动15.3......
  • MIL⁃STD⁃1553B总线介绍
    MIL⁃STD⁃1553B总线介绍MIL⁃STD⁃1553B是一种命令/响应型多路传输总线,它采用冗余的总线结构,在当前传输线发生故障时可立刻切换到冗余传输线上,防止通信中断。同时,1553B协议严格规定了消息格式,限定了每条消息的最大传输数据量及总线单元的最大响应时间,并规范了总线耦合方式、......
  • [ABC156E] Roaming 题解
    前言这哪有蓝,评分似乎有点过了。思路既然是要统计每个房间人数的排列,那我们就枚举把所有人都放到\(i\)个房间里的方案数,这个用插板法解决,把所有人都放到\(i\)个房间里也就是把他们分成\(i\)份,这一部分的答案就是在\(n\)个人的\(n-1\)个空中插入\(i-1\)块隔板的方案......
  • 150. 逆波兰表达式求值
    题目描述给你一个字符串数组tokens,表示一个根据逆波兰式表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。解题思路我们依次遍历数据,如果遇到数字我们就直接入栈,如果遇到运算符,我们就取出栈顶的元素两个,然后进行运算,这里要注意-和/这两个运算符,取栈......
  • leetcode面试经典150题- 15. 三数之和
    https://leetcode.cn/problems/3sum/description/?envType=study-plan-v2&envId=top-interview-150 packageleetcode150import("sort""testing")funcTestThreeSum(t*testing.T){nums:=[]int{0,2,2,3,0,1,2,3,-......
  • CVE-2021-21315漏洞复现
    一、基本信息攻击机:kaliIP:192.168.100.60靶机:CentOS7IP:192.168.100.40二、攻击过程下载node.js环境wgethttps://nodejs.org/dist/v12.18.4/node-v12.18.4-linux-x64.tar.xztar-xvfnode-v12.18.4-linux-x64.tar.xzmvnode-v12.18.4-linux-x64nodejsmvnodejs......
  • L1-085 试试手气 分数 15
    //10'30"#include<bits/stdc++.h>usingnamespacestd;boolarr[10][10];intmain(){for(inti=1;i<=6;++i){inttmp;cin>>tmp;arr[i][tmp]=true;}intn;cin>>n;......
  • LeetCode-Python-3154. 到达第 K 级台阶的方案数(DFS + 数学)
    给你有一个 非负 整数 k 。有一个无限长度的台阶,最低 一层编号为0。Alice 有一个整数 jump ,一开始值为0。Alice从台阶1开始,可以使用 任意 次操作,目标是到达第 k 级台阶。假设Alice位于台阶 i ,一次 操作 中,Alice可以:向下走一级到 i-1 ,但该操作......