力扣两数之和C++详解

力扣两数之和C++详解_第1张图片

解题思路

题目概括来说其实就是以下三点

1.数组nums中的两个整数相加小于target,之后要返回这两个整数的下标

2.数组nums中的元素每一个只能用一次

3.可以按任意顺序返回答案,这里我们按照从小到大的顺序返回答案

我们可以先创立两个指针p1和p2指向nums的首尾,假设nums数组中的顺序从小到大排序,那么p1就指向最小值,p2就指向最大值

这时候如果p1+p2>target,那么指针p2向左移动,也就是使p2指向一个小一点的值,因为p1+p2本质上就是最小值+最大值,如果大于target的话我们为了等于target就只能让值变小,而此时能变小的值就只有最大值,所以只能让p2向左移动;

p1+p2

如果正好p1+p2=target直接输出即可,随后返回这两个数的下标

代码层面

1.先定义变量n等于数组nums的大小,然后建立nums的下标数组,之后通过for循环遍历的方式来对下标数组初始化赋值

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        int n=nums.size();
        vectorind(n);
        for(int i=0;i

2.用sort对下标数组排序

这里面我们自定义排序规则(如果不懂直接照葫芦画瓢即可)

当i下标中的值小于j下标中的值的时候,i需要排在j的前面

sort(ind.begin(),ind.end(),[&](int i,int j)->bool{
            return nums[i]

3.创建两个指针p1和p2,这一步在解题思路中有明确讲解

int p1=0,p2=n-1;
        while(nums[ind[p1]]+nums[ind[p2]] != target)
        {
            if(nums[ind[p1]] + nums[ind[p2]] > target) p2 -= 1;
            else p1 += 1;
        }

4.创建一个结果数组来存储指针p1,p2指向的整数的下标

vector  ret(2);
        ret[0]=ind[p1],ret[1]=ind[p2];

5.我们返回结果的顺序是按照从大到小的顺序,最后返回结果即可

if(ret[0]>ret[1]) swap(ret[0],ret[1]);
        return ret;

涉及到的知识点/技巧

这里面最核心的其实就是sort的自定义规则排序

我们通过λ表达式来实现的格式为[&](int i,int j)->bool{return arr[i]

知识点补充

看过上面代码可能会有疑问“vector不是动态数组吗,为什么我们这里还为它设置了大小”,其实在上面的代码中这里的ind需要被初始化为0,1,2,...,n-1如果在声明时不指定大小,ind将是一个空的  vector 无法直接通过索引访问和赋值,指定大小后,ind会自动初始化为n个默认值(对于int类型是0),然后你可以通过索引逐个赋值。

从vector知识点上面来看的话,提前设置可以避免多次内存分配和数据复制、可以直接通过索引访问和赋值、让代码的意图更明确。

所以如果可以的话还是推荐提前设置vector数组的大小

你可能感兴趣的:(力扣排序算法题,leetcode,c++,算法)