首页 > 其他分享 >LeetCode刷题记录.Day12

LeetCode刷题记录.Day12

时间:2022-11-11 23:12:47浏览次数:73  
标签:right nums 指针 vector result Day12 刷题 LeetCode left

三数之和

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

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        sort(nums.begin(), nums.end());
        for(int i = 0; i < nums.size(); i++){
            //排序后第一个元素如果大于0,无论如何相加都不可能等于0
            if (nums[i] > 0) {
            return result;
            }
            //去重复值,第一个值,a,就是nums[i]如果和上次循环的nums[i]相等,则去重
            if(i > 0 && nums[i] == nums[i - 1]){
                continue;
            }
            int left = i + 1;
            int right = nums.size() - 1; //构造左指针和右指针
            //双指针查找
            while(right > left){
                if((nums[i] + nums[left] + nums[right]) > 0) right--; //大于0说明右边界大了,右指针收缩
                else if((nums[i] + nums[left] + nums[right]) < 0) left++; //小于0说明左边界小了,左指针收缩
                else{
                    result.push_back(vector<int>{nums[i], nums[left], nums[right]}); //说明该三元组成立。此时a的去重已经完成,对b,c进行去重
                    while(right > left && nums[right] == nums[right - 1] ) right--; //说明该右边界的左位和当前值相等,左移直到不相等,去重复值
                    while(right > left && nums[left] == nums[left + 1] ) left++; //同理,对左边界去重
                    
                    // 找到答案时,双指针同时收缩,找下一位
                    right--;
                    left++;
                }
            }
        }
        return result;
    }
};

 

这道题反而是哈希法的去重我看半天没看明白,双指针法豁然开朗。因为顺序排列,所以重复值肯定是排在一起的。去重只要对每个指针挨个移位就行。

标签:right,nums,指针,vector,result,Day12,刷题,LeetCode,left
From: https://www.cnblogs.com/tianmaster/p/16882350.html

相关文章

  • 【leetcode_C++_二叉树_day12】层序遍历 10 && 226.翻转二叉树&&101. 对称二叉树
    1.层序遍历学会二叉树的层序遍历,可以一口气打完以下十题:102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍......
  • CF 刷题计划 2
    前言CF刷题计划不知不觉离之前的刷题计划都过去半年多了,水平也提升了不少,不得不感叹时间流逝。快NOIP了,感觉学新算法没什么用,就回来刷点CF吧。那就接着之前的编号,继......
  • 洛谷刷题_质数口袋
    P5723【深基4.例13】质数口袋题目链接:https://www.luogu.com.cn/problem/P5723知识点:埃氏筛原理:要得到自然数n以内的全部素数,必须把不大于根号n的所有素数的倍数筛掉,......
  • leetcode441
    排列硬币Category Difficulty Likes Dislikesalgorithms Easy(45.89%) 248 -TagsCompanies你总共有n枚硬币,并计划将它们按阶梯状排列。对于一个由k行组成的阶梯,......
  • Leetcode第1704题:判断字符串的两半是否相似(Determine is string halves are alike)
    解题思路直接模拟。将字符串分为两半,分别遍历统计各元音出现的次数,最后比较是否相等即可。核心代码如下:boolhalvesAreAlike(strings){stringa=s.substr(......
  • leetcode(35)位运算系列题目
    不需要额外空间的方法,就往位运算上想136.只出现一次的数字异或运算的性质:1.交换律:a^b^c<=>a^c^b2.任何数于0异或为任何数0^n=>n3.相同的数异或为0:......
  • leetcode-70-爬楼梯
    转自leetcode,原题链接:https://leetcode.cn/problems/climbing-stairs/假设你正在爬楼梯。需要n 阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方......
  • LeetCode刷题记录.Day11
    赎金信题目链接代码随想录(programmercarl.com)classSolution{public:boolcanConstruct(stringransomNote,stringmagazine){intrecord[26]={......
  • 算法 Notes|LeetCode 26. 删除排序数组中的重复项 - easy
    历史LeetCode刷题文章:​​算法Notes|LeetCode349.两个数组的交集-easy​​​​算法Notes|LeetCode14.最长公共前缀-easy​​​​算法Notes|LeetCode1.两数之和......
  • LeetCode 763. 划分字母区间
    1、一上来先遍历数组,找到每个字母最后出现的位置。2、再次遍历数组,保持一个last,表示当前至少应该在哪里分割classSolution{public:vector<int>partitionLabel......