【Leetcode刷题】:算法入门__双指针介绍

文章目录

  • 什么是双指针
  • 1.题目:
  • 2.思路:
  • 3.方法一:
  • 4.方法二:
  • 5.总结:


什么是双指针

广义上:

双指针指的是用两个变量在线性结构上遍历而解决的问题

狭义上:

  • 对于数组,双指针指两个变量在数组上相向移动解决的问题;
  • 对于链表,双指针指两个变量在链表上同向移动解决的问题,也称为「快慢指针」问题。

双指针算法是基于暴力解法的优化,是很好的学习算法的入门问题

来看例题吧。

1.题目:

给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组要求也按非递减顺序排序

示例 1:

  • 输入:nums = [-4,-1,0,3,10]

  • 输出:[0,1,9,16,100]

  • 解释:平方后,数组变为 [16,1,0,9,100]

  • 排序后,数组变为 [0,1,9,16,100]

示例 2:

  • 输入:nums = [-7,-3,2,3,11]

  • 输出:[4,9,9,49,121]

提示:

  • 1 <= nums.length <= 104

  • -104 <= nums[i] <= 104

  • nums 已按非递减顺序 排序


想看【Leetcode】原题,请点击这!


2.思路:

  • 最简单的方法就是先求数组里每个数的平方,再进行排序,这是方法一

  • 而方法二是新建一个数组,再创建两个指针iji指向数组数组第一位元素,j指向数组的最后一位元素,也就是让双指针指向数组的两端,然后每次比较两个指针对应的数值,把大的那个数,放入新数组的末尾中,并移动指针,向数组中间靠拢


3.方法一:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        vector<int> a_var;
        
        for (int n:nums)
        {
            a_var.push_back(n*n);
        }

        sort(a_var.begin(), a_var.end());

        return a_var;
    }
};

4.方法二:

class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int n = nums.size();
        vector<int> new_arr(n);
        //新数组的索引opt从末尾开始
        for (int i=0,j=n-1,opt=n-1; i<=j;)
		{
            if(nums[i]*nums[i] > nums[j]*nums[j])
			{
                new_arr[opt] = nums[i]*nums[i];
                ++i;
            }
            else
			{
                new_arr[opt] = nums[j] * nums[j];
                --j;
            }
            --opt;//存放一次答案后,新数组的索引就减一
        }
        return new_arr;
    }
};

5.总结:

  • 在这道题中,方法一是暴力求解,虽然效率稍低一些,但是直观

  • 但是我们仔细看题目就会发现,数组中的数值求平方后的最大值,不是数组的首元素就是数组的末尾数,这时我们可以考虑双指针的求法


OK,下一篇我们来看双指针的几道经典例题

你可能感兴趣的:(【Leetcode】刷题与总结,学习,c++,算法)