当前位置: 首页 > wzjs >正文

日本做家纺的公司网站百度一下你就知道首页官网

日本做家纺的公司网站,百度一下你就知道首页官网,商城网站开发公司,wh网站建设有序数组双指针问题:简单问题及其变种 问题 1: 有序数组使用双指针快速搜索步骤 1 :分析并使用双指针步骤 2 :实现注意 问题 2: 变种问题(三数之和)步骤 1 :分析并排序步骤 2 &#…

有序数组双指针问题:简单问题及其变种

  • 问题 1: 有序数组使用双指针快速搜索
    • 步骤 1 :分析并使用双指针
    • 步骤 2 :实现
    • 注意
  • 问题 2: 变种问题(三数之和)
    • 步骤 1 :分析并排序
    • 步骤 2 :分析并使用双指针
    • 步骤 3 :优化
    • 步骤 4 :实现

问题 1: 有序数组使用双指针快速搜索

我们以 力扣167. 两数之和 II - 输入有序数组 为例对该问题进行求解
在这里插入图片描述

步骤 1 :分析并使用双指针

1、重要信息:numbers已经“非递减顺序排列”!!!!,我们一定要利用这个信息。
2、我们将双指针分别指向数组的头和尾,如果此时头尾数的和比target大,因为数组是非递减排序,并且我此时需要一个更大的数,所以我们只需要将左指针右移,此时和必然会增加。
3、如果此时头尾数的和比target小,同理,我们只需要将右指针左移,就可以减小两个数的和。
4、用以上的办法逐渐进行逼近,直到逼近到正确的双指针位置。

步骤 2 :实现

class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int n = numbers.size();int i = 0, j = n - 1;//双指针初始化while (i < j) {if (numbers[i] + numbers[j] == target) {//因为答案要从1开始return { i + 1,j + 1 };}else if (numbers[i] + numbers[j] > target) {j--;}else {i++;}}return {};}
};

注意

值得注意的是,以上双指针解法的前提都是,随着左右指针的移动,两数之和能严格增长或者下降,也就是满足数组的非递减特性才可以这么做。

问题 2: 变种问题(三数之和)

我们以 力扣15. 三数之和 为例对该问题进行求解

在这里插入图片描述

步骤 1 :分析并排序

由题意可知,nums是一个乱序的数组,并且最终的答案和数组中原本的顺序是无关的,所以这种题,第一反应必须是::排序。
因为数据顺序不影响答案,所以执行排序,这样重整之后,更方便我们选择合适的算法

步骤 2 :分析并使用双指针

1、我们观察:nums[i] + nums[j] + nums[k] = 0。切记一旦发现左侧是个常数C的时候,我们就要将之视作一个“空位”,所以要将左式中的一个变量移动到空位这边,这种转换思路一定要会。其实所谓难题,就是基础模板之上添加了许多转换。
2、当问题转化成,找到合适的i、j、k,让nums[j] + nums[k] = -nums[i],很明显,就是问题1,只不过我们需要在最外层加一个遍历i就可以了。
3、注意,题目中要求,不能出现重复答案,也就是说,当指针遇到重复元素的时候,我们一定要跳过,要不肯定会出现重复元素。

步骤 3 :优化

1、当nums[i] + nums[i+1] + nums[i+2] > 0 时候,这代表了有序数组最左侧最小的三个元素和都是大于0的,所以以后必不可能出现=0的情况,直接结束。
2、当nums[i]+ nums[n-1] + nums[n-2] < 0 时候,说明当前这个nums[i]不可能会存在答案,但是之后可能会有答案,所以我们跳过。

步骤 4 :实现

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(), nums.end());int n = nums.size();vector<vector<int>> ans;for (int i = 0; i < n - 2; i++) {int x = nums[i];if (i && x == nums[i - 1]) {//当遇到重复元素,这个nums[i]就是无效的,继续循环continue;}if (x + nums[i + 1] + nums[i + 2] > 0) {//优化break;}if (x + nums[n - 1] + nums[n - 2] < 0) {//优化continue;}int j = i + 1, k = n - 1;//开始双指针while (j < k) {if (x + nums[j] + nums[k] > 0) {k--;}else if (x + nums[j] + nums[k] < 0) {j++;}else {ans.push_back({ x,nums[j],nums[k] });//找到一个答案后,可能还存在多个,所以j++\k--,继续按照规则找,记得跳过重复元素j++;while (j < k && nums[j] == nums[j - 1]) {//跳过重复元素j++;}k--;while (k > j && nums[k] == nums[k + 1]) {//跳过重复元素k--;}}}}return ans;}
};
http://www.dtcms.com/wzjs/162251.html

相关文章:

  • 武汉行业网站建设可以免费推广的平台
  • 石家庄网站建设系统石家庄学院
  • 眼科医院网站开发互动营销公司
  • 帮人做设计的网站网络营销的平台有哪些
  • h网站建设推广产品怎么发朋友圈
  • wordpress固定连接优化大师tv版
  • 昆明做网站vr站长之家关键词挖掘工具
  • 网站建设齐齐哈尔链友咨询
  • python可以做网站网页设计与制作用什么软件
  • 温州集团网站建设公司搜索引擎优化的主要手段
  • 做网站开发服务商seo排名赚app官网
  • 做旅游攻略比较好的网站手机端网站优化
  • 政府类网站建设长沙关键词优化首选
  • 永久免费的网站推荐网站查询seo
  • 专业旅游网站建设流量推广怎么做
  • 网站开发完成如何上线如何建立网址
  • 郑州做网站哪家好百度客服人工服务电话
  • wordpress pwshell百度搜索优化怎么做
  • python做网站还是java如何做好网络推广
  • wordpress4.6.1中文版重庆网站seo教程
  • 成都建立公司网站最近的新闻有哪些
  • 展会网站源码网站优化排名哪家好
  • 桂林北站附近的景点百度搜索引擎优化怎么做
  • 泗阳网站建设软件外包公司有前途吗
  • 网站未授权cas要怎么做青岛seo关键词
  • 武汉市建设工程交易中心网站windows优化大师
  • 网站制作实例常见的网络推广方法
  • 怎么可以做网站做百度网站一年多少钱
  • web前端开发工程师要求电商seo是什么意思
  • 做网站挣钱打擦边球宁波seo优化定制