首页 > 其他分享 >[代码随想录] 第六天

[代码随想录] 第六天

时间:2024-01-16 17:38:10浏览次数:15  
标签:right nums int 代码 随想录 ++ 第六天 sum left

383.赎金信https://leetcode.cn/problems/ransom-note/description/
思路:本题与242.有效的字母异位词几乎相同。将字母-'a',变成0-26的数字存放于数组中,再遍历数组对比次数。

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

454.四数相加IIhttps://leetcode.cn/problems/4sum-ii/description/
思路:暴力解①:对四个数组直接嵌套for循环。暴力解②:分别使用两个结果数组存放数组和,在遍历两个结果数组求等零次数。
优解:本题只需要返回次数,不在意元素是否重复问题,使用map,两个数组和sum作为key,次数作为value,嵌套遍历前两个数组和,统计好所有出现sum次数。再嵌套遍历后两个数组和,对比map中sum和,若相加等零,则int ans++;
重点:理解并使用map.getOrDefault(Object key, V defaultValue),返回key对应value值,否则返回defaultValue。
map.put(sum,map.getOrDefault(sum,0)+1);实现了在map中将sum出现的次数自增。

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

15.三数之和https://leetcode.cn/problems/3sum/
思路:本题较难。
①:建立List<List<Integer>> result用于存放符合条件的数组
②:先将数组排序,使用i遍历,若nums[i]大于0,可直接返回。
③:left = i + 1; right = nums.length - 1;,使用左右双指针,找到符合条件的三数数组,用result存放,若结果大于0,right--,若结果小于0,left++。
④:本题难点在于去重。例如[-1,-1,0,1],当第一个-1与后面的结果遍历完后,第二个-1可直接跳过,否则会有重复的三元组。同样,[-2,-1,0,3,3]数组中,right在找到一个符合结果的三元组时,也要去重。
去重思路:{
对于i:判断i对应的元素与i-1元素是否相等,若相等可以直接跳过该元素。if (i > 0 && nums[i] == nums[i - 1]) {continue;}
对于left或right:仅在找到符合条件的三元组时需要去重,left右移到第一个与当前值不相等的位置,right左移到第一个与当前值不相等的位置。

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

}

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        int left, right, sum;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0) {
                return result;
            }
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            left = i + 1;
            right = nums.length - 1;
            while (right > left) {
                sum = nums[i] + nums[left] + nums[right];
                if (sum < 0) {
                    left++;
                } else if (sum > 0) {
                    right--;
                } else {
                    result.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 result;
    }
}
**-----------------------分割线-------------------------**

18.四数之和https://leetcode.cn/problems/4sum/
思路:本题是三数之和的加强版,在i的基础上嵌套一层j的循环遍历,增加j的去重判定。

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        int left, right, sum;
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] > 0 && nums[i] > target) {
                return result;
            }
            if (i > 0 && nums[i - 1] == nums[i]) {
                continue;
            }
            for (int j = i + 1; j < nums.length; j++) {
                if (j > i + 1 && nums[j] == nums[j - 1]) {
                    continue;
                }
                left = j + 1;
                right = nums.length - 1;
                while (right > left) {
                    sum = nums[j] + nums[i] + nums[left] + nums[right];
                    if (sum < target) {
                        left++;
                    } else if (sum > target) {
                        right--;
                    } else {
                        result.add(Arrays.asList(nums[i], nums[j], 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 result;
    }
}

太久没喝奶茶了,今天奖励自己一杯

标签:right,nums,int,代码,随想录,++,第六天,sum,left
From: https://www.cnblogs.com/cssg/p/17968135

相关文章

  • 前任开发在代码里下毒了,支付下单接口居然没加幂等
    分享是最有效的学习方式。故事又是一个风和日丽没好的一天,小猫戴着耳机,安逸地听着音乐,撸着代码,这种没有会议的日子真的是巴适得板。不料祸从天降,组长火急火燎地跑过来找到了小猫。“快排查一下,目前有A公司用户反馈积分被多扣了”。小猫回忆了一下“不对啊,这接口我也没动过......
  • 【快速阅读二】从OpenCv的代码中扣取泊松融合算子(Poisson Image Editing)并稍作优化
    泊松融合我自己写的第一版程序大概是2016年在某个小房间里折腾出来的,当时是用的迭代的方式,记得似乎效果不怎么样,没有达到论文的效果。前段时间又有网友问我有没有这方面的程序,我说Opencv已经有了,可以直接使用,他说opencv的框架太大,不想为了一个功能的需求而背上这么一座大山,看......
  • Confluence Server && Confluence Data Center 远程代码执行漏洞预警
    影响产品ConfluenceServer、ConfluenceDataCenter漏洞类型远程代码执行危害等级高CVE编号CVE-2024-21672CVE-2024-21673CVE-2024-21674CVSS评分:CVE-2024-21672:8.3CVE-2024-21673:8CVE-2024-21674:8.6影响范围:CVE-2024-216727.13.0,7.19.0,8.0.0,8.1.0,8.......
  • springboot第48集:【思维导图】地图,面向对象,异常,功能代码
    在SpringBoot中,可以通过编写拦截器(Interceptor)来对请求进行拦截与处理。下面是一个简单的拦截器实现示例:创建一个类并实现HandlerInterceptor接口publicclassAuthInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequest......
  • MFC---多线程(线程同步之关键代码段)
    关键代码段,也称为临界区,工作在用户方式下。它是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权。通常把多线程中访问同一种资源的那部分代码当做关键代码段。1.初始化关键代码段调用InitializeCriticalSection函数初始化一个关键代码段。InitializeCriticalSection(......
  • Unity DoTween 代码使用方法
    DOTween.To(()=>myValue,x=>myValue=x,newVector3(0,0,0),3);myValue可以是指定类型的参数,如Scale/Color/Pos等参数 GameObject_accPanel;_accPanel.transform.DOScale(newVector3(0,0,0),0.2f);部分可以直接使用transform等参数来直接执行某一种动......
  • 网址链接跳转外部安全提醒代码
    网页的安全性优化是一个越来越被开发者重视的问题,当本站链接点击跳转到第三方外链接时,要弹框提示信息,需要支持jquery引用。<!DOCTYPEhtml> <html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"> <metahttp-equiv="X-UA-Compat......
  • U-net基础代码
    importtorchimporttorch.nnasnnclassConvBlock(nn.Module):def__init__(self,in_channels,out_channels):super(ConvBlock,self).__init__()self.conv=nn.Conv2d(in_channels,out_channels,kernel_size=3,stride=1,padding=1)......
  • python接口自动化框架零代码极限封装之流程用例和DDT数据驱动
    1.流程用例1.1什么是流程用例工具:postmanjmeter每个接口就是一个用例,称之为单接口用例自动化:pytestunittestyaml每个用例,可以包含多个接口,称之为流程用例需要多个接口配合才能完成例子:微信上传功能:获取token上传文件 商城购物功能选择商品加入购物车......
  • 屎山代码风格指南(避免被优化&&避免被接盘)
    欢迎补充!!!序言良好的代码结构:Bad......