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

【优选算法】三数之和

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

算法原理:

方法:排序+双指针+去重

1.排序

2.固定一个数 a(a <= 0)

3.在该数后面的区间内,利用“双指针算法”快速找到两个的和等于 -a 即可

4.去重

        找到一种结果之后,left 和 right 指针要跳过重复元素

        当使用完一次双指针算法之后,i 也需要跳过重复元素

        避免越界

5.不漏

        找到一种结果之后,不要“停”,缩小区间,继续寻找

代码编写:

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ret = new ArrayList<>();
        //1.排序
        Arrays.sort(nums);
        //2.利用双指针解决问题
        int n = nums.length;
        for(int i = 0; i < n;){
            if(nums[i] > 0){
                break;
            }
            int left = i + 1, right = n - 1, target = -nums[i];
            while(left < right){
                int sum = nums[left] + nums[right];
                if(sum > target){
                    right--;
                }else if(sum < target){
                    left++;
                }else{
                    //nums[i] nums[left] nums[right]
                    ret.add(new ArrayList<Integer>(Arrays.asList(nums[i], nums[left], nums[right])));
                    left++;
                    right--;//缩小区间继续寻找
                    //去重
                    while(left < right && nums[left] == nums[left-1]){
                        left++;
                    }
                    while(left < right && nums[right] == nums[right+1]){
                        right--;
                    }
                }
            }
            //去重:i
            i++;
            while(i < n && nums[i] == nums[i-1]){
                i++;
            }
        }
        return ret;
    }
}

复杂度分析: 

  • 时间复杂度为:O(n^2)
  • 空间复杂度为:O(n)

http://www.kler.cn/a/465297.html

相关文章:

  • Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能
  • HP 电脑开机黑屏 | 故障判断 | BIOS 恢复 | BIOS 升级
  • 【JVM】总结篇-运行时内存篇
  • 3.5 字典树(Trie)与后缀树
  • Django中自定义模板字符串
  • AutoSar架构学习笔记
  • 聚合函数理解
  • 深入了解PINN:物理信息神经网络(Physics-Informed Neural Networks)
  • 电影院售票 - 策略模式(Strategy Pattern)
  • github提交不上去,网络超时问题解决
  • 【AIGC】ChatGPT 记忆功能揭秘:使用与管理的全方位指南
  • 计算帐户每月余额,补齐缺失日期:从 SQL 到 SPL
  • Luma AI 简单几步生成视频
  • SpringMVC(一)配置
  • 【OpenCV】使用Python和OpenCV实现火焰检测
  • Spring Boot 中 TypeExcludeFilter 的作用及使用示例
  • 数据挖掘——聚类
  • vue3基础,小白从入门到精通
  • 三维算法基础知识
  • Unity Shader:从基础使用到动画实现全解析
  • 二层交换机和三层交换机
  • Vue3+Vue-router(history+路由前缀)+Vite 下本地刷新找不到页面问题
  • 钉钉h5微应用引用钉钉文件地址
  • 解决MYSQL Table has no partition for value from column_list的问题
  • jenkins修改端口以及开机自启
  • Kafka和Jenkins实现EMR上PySpark和EC2上Airflow的CI/CD