首页 > 其他分享 >[LeetCode Hot 100] LeetCode15. 三数之和

[LeetCode Hot 100] LeetCode15. 三数之和

时间:2023-12-03 11:44:40浏览次数:28  
标签:nums int 三数 sum len Hot 数组 100 指针

题目描述

思路

  1. 特判:对于数组长度为n,如果数组为null或者数组长度小于3,返回[]。
  2. 对数组进行排序。
  3. 遍历排序后的数组:
    1. 若 nums[i]>0nums[i]>0nums[i]>0:因为已经排序好,所以后面不可能有三个数加和等于 000,直接返回结果。
    2. 对于重复元素:跳过,避免出现重复解。
    3. 令左指针 L=i+1L=i+1L=i+1,右指针 R=n−1R=n-1R=n−1,当 L<RL<RL<R 时,执行循环:
      1. 当nums[i] + nums[L] + nums[R] == 0,执行循环,判断左界和右界是否和下一位置重复,去除重复解。并同时将L,R移动到下一位置,寻找新的解。
      2. 若和大于0,说明nums[R]太大,R左移。
      3. 若和小于,0,说明nums[L]太小,L右移。

对撞双指针:有序。
定义i < j < k,其中固定nums[i],把j和k当做双指针。

方法一:双指针

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        // 1. 特殊值判断
        int len = nums.length;
        if (nums == null || len < 3) return null;
        // 2. 结果集
        List<List<Integer>> res = new ArrayList<>();
        // 3. 对数组进行排序
        Arrays.sort(nums);
        for (int i = 0; i < len; i ++) {
            // 规定i < j < k, 若nums[i] > 0,则三数之和一定不会等于0
            if (nums[i] > 0) break;
            // 第一次去重:如果i和上一次相同,则会得到相同结果,因为每遍历一次i都会得出所有结果
            if (i > 0 && nums[i] == nums[i - 1]) continue;
            // 定义双指针
            int j = i + 1;
            int k = len - 1;
            while (j < k) {
                int sum = nums[i] + nums[j] + nums[k];
                if (sum == 0) {
                    res.add(Arrays.asList(nums[i], nums[j], nums[k]));
                    // 第二次去重
                    while (j < k && nums[j] == nums[j + 1]) j ++;
                    while (j < k && nums[k] == nums[k - 1]) k --;
                    // while只是停止在了下一个不重复的地方。但是还没有移动那个下一个位置。 所以需要在进行一次++--
                    j ++;
                    k --;
                } else if (sum > 0) {
                    k --;
                } else if (sum < 0) {
                    j ++;
                }
            }
        }
        return res;
    }
}

标签:nums,int,三数,sum,len,Hot,数组,100,指针
From: https://www.cnblogs.com/keyongkang/p/17872754.html

相关文章

  • [LeetCode Hot 100] LeetCode160. 相交链表
    题目描述思路方法一:/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(intx){*val=x;*next=null;*}*}*/publicclassSolution{publicListNo......
  • 初中英语优秀范文100篇-015An Unusual Experience-一次不同寻常的经历
    PDF格式公众号回复关键字:SHCZFW015记忆树1ItwasFiriday.翻译那天是星期五简化记忆星期五句子结构在句子“ItwasFriday”中,有以下成分:“It”是主语,作为一个不定代词,用来指代或代表前文提到的特定时间或事件。这里指代的是具体的某个时间或事件。“was”是......
  • Photoshop批量替换图层的方法
    平时做图片,应该有遇到这样的场景,比如P奖状、P邀请函,内容是一样的,但是图片上的名字是不一样的,要是要P100张的话,一个个手动复制改名字肯定会吐血(╯°□°)╯︵┻━┻Photoshop里有个变量的功能,就是专门解决这个问题的。先将要批量替换的图层,通常是文字图层,单独新建一层。然后在图......
  • [LeetCode Hot] LeetCode283. 移动零
    题目描述方法一:时间复杂度O(n2)classSolution{publicvoidmoveZeroes(int[]nums){for(inti=0;i<nums.length;i++){//指针i为0的时候停止if(nums[i]==0){//遍历[i+1,nums.length-1],如果遇......
  • [LeetCode Hot 100] LeetCode11. 盛最多的水
    题目描述方法一:暴力,超出时间限制模拟所有情况,记录最大的体积值。体积=Math.min(height[i],height[j])*(j-i)classSolution{publicintmaxArea(int[]height){intres=Integer.MIN_VALUE;for(inti=0;i<height.length;i++){......
  • 初中英语优秀范文100篇-014There's Always Hope-常怀希望
    PDF格式公众号回复关键字:SHCZFW014记忆树1Lifeisnobedofroses.翻译生活并非一帆风顺。简化记忆生活句子结构该句是一个简单句,结构分析如下:主语:“Life”(生活)谓语:“is”(是)表语:“nobedofroses”(不是玫瑰床)定冠词:“no”(没有)名词短语:“bedofroses”(玫瑰床......
  • [LeetCode Hot 100] LeetCode128. 最长连续序列
    题目描述思路将数组所有点映射到一个数轴上,可以发现问题变为求每段区间首元素到尾元素的长度的最大值。区间的长度:区间尾元素值-区间首元素值+1方法一:超出时间限制这个方法是最初自己想到的,但是超时了,主要原因是程序会有冗余的遍历过程,增加了开销。思路:(时间复杂度太高)......
  • 畅网全新N100 NAS主板悄悄上架了
     来看看靓照 ......
  • NVIDIA H100 GPU:GPU的机密计算
    NVIDIA的官方说明:https://www.nvidia.cn/data-center/solutions/confidential-computing/   ==========================......
  • NI-9219 100 S/s/ch国产化4通道C系列通用多功能模拟输入模块,支持多种传感器
    100S/s/ch,4通道C系列通用模拟输入模块NI-9219专为多功能测试而设计。NI-9219可用于测量来自多种传感器(如应变计,电阻温度检测器(RTD),热电偶,测压元件和其他有源传感器等)的信号,以及制作1/4桥,半桥和全桥电流测量,且具有内置电压和电流激励。您可以在每个通道上分别选择,从而执行不同的测......