每日一题 — 三数之和

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

思路:

  1. 双指针思想
  2. 先给数组排序
  3. 然后固定一个数、再设left、right指针,nums[left] + nums[right] = -nums[a]
  4. 大于的话right--,小于的话left++
  5. 每次处理完left、right之后需要判断去重
  6. i也需要判断去重
  7. 代码
复制代码
   public List<List<Integer>> threeSum(int[] nums) {
           //创建返回的数组
           List<List<Integer>> list = new ArrayList<>();
           //去重
           Arrays.sort(nums);
           //求数组长度
           int n = nums.length;
           //进入循环
           for(int i = 0; i < n;){
               //小优化
               if(nums[i] > 0){
                   break;
               }
               int left = 1+i, right = n-1;
               
               int target = -nums[i];
               while(left < right){
                   //转换为两数之和
                   int sum = nums[left] + nums[right]; 
                   if(sum > target){
                       right--;
                   }else if(sum < target){
                       left++;
                   }else{
                       list.add(new ArrayList<Integer>(Arrays.asList(nums[left],nums[right],nums[i])));
                       //缩小区间,继续寻找
                       left++;
                       right--;
                       //对left去重
                       while(left < right && nums[left] == nums[left-1]){
                           left++;
                       }
                       //对right去重
                       while(left < right && nums[right] == nums[right+1]){
                           right--;
                       }
                   }
               }
               //对nums[i]去重
               i++;
               while(i < n && nums[i] == nums[i-1]){
                   i++;
               }
           }
           return list;
       }
相关推荐
金融小师妹1 小时前
基于哈塞特独立性表态的AI量化研究:美联储政策独立性的多维验证
大数据·人工智能·算法
纪元A梦4 小时前
贪心算法应用:化工反应器调度问题详解
算法·贪心算法
阿让啊5 小时前
C语言strtol 函数使用方法
c语言·数据结构·c++·单片机·嵌入式硬件
深圳市快瞳科技有限公司5 小时前
小场景大市场:猫狗识别算法在宠物智能设备中的应用
算法·计算机视觉·宠物
liulilittle5 小时前
OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
网络·c++·网络协议·tcp/ip·算法·ip·通信
superlls8 小时前
(算法 哈希表)【LeetCode 349】两个数组的交集 思路笔记自留
java·数据结构·算法
田里的水稻8 小时前
C++_队列编码实例,从末端添加对象,同时把头部的对象剔除掉,中的队列长度为设置长度NUM_OBJ
java·c++·算法
纪元A梦8 小时前
贪心算法应用:保险理赔调度问题详解
算法·贪心算法
Ripple123129 小时前
数据结构:顺序表与链表
数据结构·链表
Jayden_Ruan9 小时前
C++逆向输出一个字符串(三)
开发语言·c++·算法