当前位置: 首页 > news >正文

哈希表-三数之和

代码随想录-刷题笔记

15. 三数之和 - 力扣(LeetCode)

内容:

这道题讲真真挺有意思的。双指针的用法很巧妙,而且去重的细节多到离谱。

哈希表本身的做法我没搞懂,而且确实复杂的很。既然有更好的方法就一步到位

本身思路也比较好想,但是中间超级多的细节。可能是我做的感觉最琐碎的一道题了 。

三者之和等于零,不妨令三者为 nums[i] , nums[j] , nums[k]

nums[i] + nums[j] = -nums[k] 这里的 三个数值不进行大小区分

 实际上,确定两个就最OK了。

最后要得到的结果也是一个不重复的三元组,由此,需要得到三个具体的数就好了。

不需要记录下标 ,这点很重要(我最开始的思路搞错过)

无非就是几种结果

Part1. 负+正+正

Part2. 0+0+0

Part3. 负+负+正

因此,对于一个无规律的数组,想要找到正负的一个相对性,最好的办法是先进行排序

排完序还有好处,可以看到这个值和0进行比较是更大还是更小

 定1 , 走2

遍历一个i , 然后 用left和right去缩范围.

复杂度O(n^2)无法避免的.

有两种情况,这两种情况讨论好了之后都很简单

nums[i]+nums[right]+nums[left] > 0 -> right-1

nums[i]+nums[right]+nums[left] < 0 -> left+1

代码如下:

去重的关键逻辑在代码注释里面,可以仔细看一下

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> result = new ArrayList<>();
        for(int i = 0 ; i < nums.length ; i++) {
            if(nums[i] > 0) break; 
            //最小的都大于零
            if(i>0 && nums[i-1] == nums[i]) continue;
            //这一步很关键,去重,如果是nums[i]==nums[i+1] 是防止 元组内重复
            int left = i + 1;
            int right = nums.length-1;
            while (right>left) {
                if(nums[i]+nums[right]+nums[left] > 0) {
                    right--;
                    //while(right> left && nums[right] == nums[right+1]) right--;
                }else if(nums[i]+nums[right]+nums[left] < 0) {
                    left++;
                    //while (right>left && nums[left] == nums[left-1]) left++;
                }else{
                    result.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right])));
                    while (right > left && nums[left] == nums[left+1]) {
                        left++;
                    }//去重 , 这里能跟后一位比较的原因是因为该位已经进入元组内
                    while (right>left && nums[right] == nums[right-1]) {
                        right--;
                    }
                    left++;
                    right--;
                }
            }

        }
        return result;
    }
}

总结:

该题最重要的就是进行去重,还有就是双指针的巧用~

注意减枝!!还有就是比较的顺序。进行去重!

元组内还是不同元组之间的比较

相关文章:

  • 探秘AES加密算法:多种Transformation全解析
  • 一个单点登录的token 无感刷新的node 后台 和前端调用
  • ubuntu 22.04 安装vsftpd服务
  • CCF-GESP 等级考试 2024年9月认证C++一级真题解析
  • k8s强制删除状态为 Terminating的Namespace
  • 如何利用Spring的@Value注解实现配置信息的动态注入与管理?
  • 自动化遇到的问题记录(遇到问题就更)
  • 如何测试和验证CVE-2024-1430:Netgear R7000 路由器信息泄露漏洞分析
  • 【C语言】左旋字符串(三种实现方式)
  • 【Git版本控制器】:第一弹——Git初识,Git安装,创建本地仓库,初始化本地仓库,配置config用户名,邮箱信息
  • fps动作系统9:动画音频
  • DeepSeek遇袭后的深思:ManageEngine ITOM如何筑牢安全防线
  • Uniapp 获取定位详解:从申请Key到实现定位功能
  • 告别同步费用!用「缤纷云 + 思源」实现 50G 免费空间 + 思源笔记加密同步,这份薅羊毛攻略藏不住了
  • 游戏引擎学习第101天
  • Redis 数据类型 String 字符串
  • java商城解决方案
  • NixHomepage - 简单的个人网站
  • C#运动控制——轴IO映射
  • Fiori APP配置中的Semantic object 小bug
  • 个人网站名称/seo整站优化吧
  • wordpress显示不出来/信息如何优化上百度首页公司
  • 企业公司网/seo排名推广
  • 医药网站建设方案/实体店营销方案
  • 建设银行可以查房贷的网站/外贸展示型网站建设公司
  • 高密做网站哪家强价位/中山做网站推广公司