首页 > 其他分享 >相向双指针

相向双指针

时间:2024-07-07 09:19:58浏览次数:14  
标签:nums int ++ vector numbers ans 相向 指针

167. 两数之和Ⅱ-输入有序数组

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        vector<int> ans;
        int n = numbers.size();
        int l = 0, r = n - 1;
        while (l < r) {
            if ((numbers[l] + numbers[r]) == target) {
                ans.push_back(l+1), ans.push_back(r+1);
                break;
            } else if ((numbers[l] + numbers[r]) < target) {
                l++;
            } else r--;
        }
        return ans;
    }
};

15.三数之和

本题可以看作两数之和的升级版,即固定一个数不动,看另外两个数之和是否等于这个数的相反数。时间复杂度为 \(O(n^2).\) (枚举第一个数为 \(O(n)\),双指针为 \(O(n)\))。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());//先排序,方便尺取
        vector<vector<int>> ans;
        int n = nums.size();
        for (int i = 0; i < n - 2; i++) {
            int x = nums[i];
            if (i && x == nums[i - 1]) continue;//跳过重复数字(当前nums[i]已经被使用过)
            if (x + nums[i + 1] + nums[i + 2] > 0) break;//当x与其后的两个数之和大于0,说明这组无解(后面的数变大或x变大都不可能再等于0)
            if (x + nums[n - 2] + nums[n - 1] < 0) continue;//如果x与最后面的两个数之和小于0,说明后面两个数变小也仍然小于0,只有增大x。
            int l = i + 1, r = n - 1;
            while (l < r) {
                int sum = x + nums[l] + nums[r];
                if (sum > 0) r--;
                else if (sum < 0) l++;//尺取
                else {
                    ans.push_back({x, nums[l], nums[r]});
                    l++;//当前的l和r所指向的数下回不能再使用。
                    while (l < r && nums[l] == nums[l - 1]) l++;
                    r--;
                    while (l < r && nums[r] == nums[r + 1]) r--;
                }
            }
        }
        return ans;
    }
};

标签:nums,int,++,vector,numbers,ans,相向,指针
From: https://www.cnblogs.com/pangyou3s/p/18288207

相关文章

  • (十九)指针与迭代器
    前言本来这次我想写关于进制的帖子的,但是感觉指针在为后面的很多内容做铺垫,所以我先把关于指针的帖子写了。况且我知道有很多小伙伴现在没有学习指针,点个赞吧,求求啦!正文指针还记得我们定义普通变量的时候用的是TypVar=Val;,而指针在之前我们讲过,分别出现在这两个帖......
  • 力扣-283移动零-双指针
    力扣-283移动零-双指针—、题目解析二、解题思路三、代码实现—、题目解析给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输出:[0]二、......
  • 第18节 指针与数组
    文章目录第18节指针与数组1.一维数组与指针2.指针与字符串第18节指针与数组1.一维数组与指针►C++程序员更偏爱使用指针来访问数组元素,这样做的好处是运行效率高、写法简洁。►1.一维数组的地址 ►数组由若干个元素组成,每个元素都有相应的地址,通过......
  • 第19节 指针与函数
    文章目录第19节指针与函数1.指针作为函数的参数1、指针作为函数的参数2、数组作为函数的参数2.引用和指向函数的指针3、引用4、指向函数的指针第19节指针与函数1.指针作为函数的参数1、指针作为函数的参数►指针最重要的应用是作为函数参数,它使得被调函数......
  • 【leetcode】双指针算法题
    文章目录1.算法思想2.移动零3.复写零方法一方法二4.快乐数5.盛水最多的容器方法一(暴力求解)方法二(左右指针)6.有效三角形的个数方法一(暴力求解)方法二(左右指针)7.两数之和8.三数之和9.四数之和1.算法思想常见的双指针有两种形式,⼀种是左右指针,⼀种是快慢指针。左右......
  • C++基础知识持续更新,今天来记录结构体的基本知识,包括结构体的定义和使用,结构体数组,结
    C++结构体C++基础知识持续更新,今天来记录结构体的基本知识,包括结构体的定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体中的const的使用场景,以及结构体的案例。1.结构体的定义和使用结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。......
  • 函数指针 和 指针函数区别以及使用方法
    问题由来:typedefint(*UaBase_ComFunction)(void);UABASE_API(int)UaBase_RegisterComFunction(UaBase_ComFunctiona_pFunction);UABASE_API(int)UaBase_UnregisterComFunction(UaBase_ComFunctiona_pFunction);上述代码的作用:声明的一个函数指针(函数类型的指针),作为函数形......
  • const修饰指针变量和assert断言
    一.const修饰指针变量一般来说,const修饰指针变量,可以放在*的左边,也可以放在*的右边,两个表示方法的意义是不一样的。1.代码1——测试无const修饰的情况voidtest1(){ intn=10; intm=20; int*p=&n; *p=20;//1 p=&m;//2}在这个代码中1和2所在的语句均可以......
  • 函参中的双重指针
    在学习swap函数时,若想改变实参,可以将函参设置为指针类型。那么函参中的双重指针,也是这种含义。即想改变实参(指针类型)的指向或值时,可以用双重指针。若只是想改变值,可以使用单指针。voidchange(char*p){p="bbb";}intmain(){char*v="aaa";change(v......
  • 指针数组与数组指针(超详细!!!)
    指针数组秘诀:括号优先,先右后左,由近及远        指针数组是一个数组,其中每个元素都是一个指针。指针数组可以用于存储指向不同数据类型的指针,例如字符、整数或结构体等。int*p[n];//定义了一个指针数组,数组大小为n,数组中的每个元素都是一个int*指针 存储指向整......