【c++复健】双指针-leetcode应用题

继续撸c++和算法。
双指针数组操作。
第一个题目是给一组递增排列的数组(有负数和正数),然后要你把每个元素平方后的结果重新按照升序排列。

解题思路是,在一个for循环里面,设置两个指针,一个指向顺序脚标,一个指向逆序脚标,然后设置一个变量来代表新数组里面的脚标。

直接上代码:

class Solution {public:vector<int> sortedSquares(vector<int>& nums) {int len = nums.size();int i,j,povit;vector<int> newArray(len);for(i=0,j = len -1,povit = len - 1; i<=j;){if(nums[i] * nums[i] >= nums[j]*nums[j]){newArray[povit] =  nums[i] * nums[i];i++;}else{newArray[povit] = nums[j]*nums[j];j--;}povit--;}return newArray;}
};

第二题是旋转数组,要求用尽量简单的方法,做到把一个数组【环】中的数组向后挪n位。
我的思路是先用数组的length对n位取模。
然后算出在数组末尾的多少个数据将要被挪到新数组的前排。
这样同时操作,前排数组挪到后排,和后排数组挪到前排,两个挪动。
最大挪动次数为前排数据的个数或者后排数据的个数(取max)。

直接上代码:

class Solution {public:void rotate(vector<int>& nums, int k) {int len = nums.size();int realMove = k % len;int preStart = 0;vector<int> ans(len);for(int i = preStart, j = len - realMove;i<len-realMove || j < len;){if(i<len - realMove){ans[i + realMove] = nums[i];}if(i<realMove){ans[i] = nums[j];++j;}i++;}for(int i = 0;i<len;i++){nums[i]  = ans[i];}}
};

这个方法时间复杂度尚可,但是貌似空间复杂度不行,在提交之后在耗时上比较优秀,但是内存占用比人家多很多,我在整其他的办法(人菜是这样的,菜了好几年了)。

第三题,一道很简单的移动0。(力扣双指针283)
题目要求是把数组中的0移到数组后排去,其他数组元素按照原来顺序排。
我本来想的是换位置然后重新排列。
想复杂了,其实直接遇到0是每个数往前挪动一位就行;
用的是双循环嵌套,所以时间用了很多(大概是n2),但是空间复杂度排名还可以。

class Solution {public:void moveZeroes(vector<int>& nums) {int len = nums.size();int i;int j;int k;for(i = 0,j = len -1 ;i < j;){if(nums[j] == 0){j--;}if(nums[i] == 0){for(k = i;k<j;k++){nums[k] = nums[k+1];}nums[j] = 0;}if(nums[i] != 0) i++;}}
};

但是这个方法并不标准,也不能很好的体现双指针的思想。
下面提供一种“标准化的快慢指针”:
快指针,遍历数组,找到不为0的元素,赋值给慢指针指向的位置。
慢指针,每次被赋值一次,才++;
这空间复杂度就小很多了,是n
直接上代码(这个格式牢记!)

class Solution {public:void moveZeroes(vector<int>& nums) {int i,j;i = 0; j = 0;int len = nums.size();for(i;i<len;){if(nums[i] != 0){nums[j++] = nums[i];}i++;}while(j<len){nums[j++] = 0;}}
};

下一道题是求升序数组中俩数和为target值,并且建个数组返回出来。
一定有俩这样的数。leetcode两数之和(167)

我一开始是这么写的,双指针。

class Solution {public:vector<int> twoSum(vector<int>& numbers, int target) {int len = numbers.size();int i = 0;int j = 1;int answer[2];while(i<j){if(numbers[i] + numbers[j] != target){if(j == len - 1){i++;j=i+1;}else{j++;}}else{answer[0] = i+1;answer[1] = j+1;break;}}return vector<int>(answer,answer+2);}
};

然后被测试用例一大堆0000000000,后面99999999999给干碎了,我吐了【】

所以这个题目的中心思想是“缩减搜索空间”’
(具体内容参考官方题解精选,大佬太牛了)

我改成这样了:

class Solution {public:vector<int> twoSum(vector<int>& numbers, int target) {int len = numbers.size();int i = 0;int j = len - 1;int answer[2];int tureT = 0;while(i<j){tureT = target - numbers[i];if(tureT < numbers[j]){j--;}else if(tureT > numbers[j]){i++;}else{answer[0] = i+1;answer[1] = j+1;break;}}return vector<int>(answer,answer+2);}
};

【c++复健】双指针应用相关推荐

  1. 【c++复健】双指针(第二弹)

    [c++复健]双指针(第二弹) 还是在乐扣刷双指针题目. 这次第一题是字符串反转,没什么要求,就是不能新建数组,那就直接双指针对换位置. class Solution {public:void rev ...

  2. 个人向前端知识“复健”

    let obj = { a: 1, b: 2 }; Object.prototype.c = 3; // 所有obj添加c Object.defineProperty(obj, 'd', { enum ...

  3. 前端复健(微信小程序)

    前端复健 WXML语言(HTML衍生物) 分为成对出现和不成对出现 属性设置 <关键词 属性名称="属性值"> 通用属性:样式,id,响应函数,参数传递 class中的 ...

  4. 2019NOIP算法复健+学习

    前言: 原本因为kma太弱,很多算法没学学了也不会用,打算设置密码给自己看.后来想了想,觉得也没有必要,既然决定了要学些东西到脑子里,就没什么好丢人的. 注:"×"意为完全没学,& ...

  5. JAVA复健DateNote.001

    JAVA复健手术第一天 jdk环境配置 1,安装jdk,同时记住java文件安装目录2,设置环境变量 编辑PATH变量,在末尾加上 %JAVA_HOME%\bin; 新建CLASSPATH %JAVA ...

  6. 【综合复健训练2021/1/18:题解】Comprehensive Training (CF 1000 ~ 1600)

    Comprehensive Training (CF 1000 ~ 1600) 前言 A:贪心 1600 B:排序+贪心 1400 C:二分+贪心 1800 D:博弈 1200 F:DFS搜索 160 ...

  7. 专题采访高维视力复健体系创始人 两天看清2.0的四维六度空间集训法

    李彦良,国家视力执业保健师,创新中医传承人,特色中医执业医师,脑科学研究训练专家,脑神经网络专业硕士,美式心理疗愈实战专家,太极养生功法传承人,他在国内首创一种全面完整的高维视力复健Hws体系,技术全 ...

  8. 【c++ 复健】从简单的做起,数组和二维数组

    [c++ 复健]从简单的做起,c++数组和二维数组 知识点主要是二维数组,一维数组直接建就行了. 静态的: type arrayName[array size]; 在堆里动态分配空间创的动态数组: d ...

  9. 算法题复健之路 第四天 第五天 第六天

    第四天: 做了两题 零钱兑换1 2 分别对应了 322 518 两题都是动态规划 背包问题, 要点还是跟前面的动态规划一样 建立一个dp矩阵,注意初始值的设定,之后维护这矩阵即可,注意转移条件,背包问 ...

最新文章

  1. 【WPF】如何使用wpf实现屏幕最前端的绘图?
  2. flask静态html
  3. 数字中国建设再提速,智慧金融发展如何跑出“加速度”?
  4. iOS8开发~UI布局(一)初探Size Class
  5. 鸿蒙系统sp3什么意思,怎么看电脑系统是哪个版本的?例如SP2 SP3?
  6. github上传本地代码
  7. Java / Cloud:如何快速创建支持Kubernetes的REST微服务
  8. 步进电机编写单4拍或4-8拍方式的汇编或c语言控制程序.,基于SCM和PLC的两种步进电机控制方法...
  9. 使用抽象类还是接口(Java)
  10. [转]Windows关机过程分析与快速关机
  11. 求mn的最大公约数和最小公倍数c语言,c语言如何求最大公约数和最小公倍数
  12. matlab分离实部虚部,MATLAB/simulink中,想让电流表测出的值为复数形式,有实部虚部,将powergui设置为phasors仿真,总是出错...
  13. MindManager2018,修改下载时间
  14. 农业物联网系统功能特点
  15. LinkedIn领英人脉显示1度、2度、3度、领英会员的意思和区别是什么?
  16. android---转轮菜单
  17. Python官方中文文档上线了,不用再苦寻民间汉化组了
  18. 过滤掉URL中的参数部分
  19. 【文献翻译CVPR2022】SoftGroup for 3D Instance Segmentation on Point Clouds
  20. 质量指标——什么是增量覆盖率?它有啥用途?

热门文章

  1. 考研常识|夏令营和预推免有什么区别?
  2. stagefright框架(四)-Video Buffer傳輸流程
  3. 前途是光明的,道路是曲折的
  4. 如何使用python下载视频-使用Python从直接URL下载视频
  5. 安装oracle-- redhat-- ins_ctx.mk问题
  6. 2013华为工作之研究所行
  7. 已安装过Mysql,再次安装最终一直显示未响应
  8. 医学图像领域,是时候用视觉Transformer替代CNN了吗?
  9. APP怎么在论坛推广?行业论坛渠道要把握!
  10. 项目管理中的边边角角 之二