【c++复健】双指针应用
【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++复健】双指针应用相关推荐
- 【c++复健】双指针(第二弹)
[c++复健]双指针(第二弹) 还是在乐扣刷双指针题目. 这次第一题是字符串反转,没什么要求,就是不能新建数组,那就直接双指针对换位置. class Solution {public:void rev ...
- 个人向前端知识“复健”
let obj = { a: 1, b: 2 }; Object.prototype.c = 3; // 所有obj添加c Object.defineProperty(obj, 'd', { enum ...
- 前端复健(微信小程序)
前端复健 WXML语言(HTML衍生物) 分为成对出现和不成对出现 属性设置 <关键词 属性名称="属性值"> 通用属性:样式,id,响应函数,参数传递 class中的 ...
- 2019NOIP算法复健+学习
前言: 原本因为kma太弱,很多算法没学学了也不会用,打算设置密码给自己看.后来想了想,觉得也没有必要,既然决定了要学些东西到脑子里,就没什么好丢人的. 注:"×"意为完全没学,& ...
- JAVA复健DateNote.001
JAVA复健手术第一天 jdk环境配置 1,安装jdk,同时记住java文件安装目录2,设置环境变量 编辑PATH变量,在末尾加上 %JAVA_HOME%\bin; 新建CLASSPATH %JAVA ...
- 【综合复健训练2021/1/18:题解】Comprehensive Training (CF 1000 ~ 1600)
Comprehensive Training (CF 1000 ~ 1600) 前言 A:贪心 1600 B:排序+贪心 1400 C:二分+贪心 1800 D:博弈 1200 F:DFS搜索 160 ...
- 专题采访高维视力复健体系创始人 两天看清2.0的四维六度空间集训法
李彦良,国家视力执业保健师,创新中医传承人,特色中医执业医师,脑科学研究训练专家,脑神经网络专业硕士,美式心理疗愈实战专家,太极养生功法传承人,他在国内首创一种全面完整的高维视力复健Hws体系,技术全 ...
- 【c++ 复健】从简单的做起,数组和二维数组
[c++ 复健]从简单的做起,c++数组和二维数组 知识点主要是二维数组,一维数组直接建就行了. 静态的: type arrayName[array size]; 在堆里动态分配空间创的动态数组: d ...
- 算法题复健之路 第四天 第五天 第六天
第四天: 做了两题 零钱兑换1 2 分别对应了 322 518 两题都是动态规划 背包问题, 要点还是跟前面的动态规划一样 建立一个dp矩阵,注意初始值的设定,之后维护这矩阵即可,注意转移条件,背包问 ...
最新文章
- 【WPF】如何使用wpf实现屏幕最前端的绘图?
- flask静态html
- 数字中国建设再提速,智慧金融发展如何跑出“加速度”?
- iOS8开发~UI布局(一)初探Size Class
- 鸿蒙系统sp3什么意思,怎么看电脑系统是哪个版本的?例如SP2 SP3?
- github上传本地代码
- Java / Cloud:如何快速创建支持Kubernetes的REST微服务
- 步进电机编写单4拍或4-8拍方式的汇编或c语言控制程序.,基于SCM和PLC的两种步进电机控制方法...
- 使用抽象类还是接口(Java)
- [转]Windows关机过程分析与快速关机
- 求mn的最大公约数和最小公倍数c语言,c语言如何求最大公约数和最小公倍数
- matlab分离实部虚部,MATLAB/simulink中,想让电流表测出的值为复数形式,有实部虚部,将powergui设置为phasors仿真,总是出错...
- MindManager2018,修改下载时间
- 农业物联网系统功能特点
- LinkedIn领英人脉显示1度、2度、3度、领英会员的意思和区别是什么?
- android---转轮菜单
- Python官方中文文档上线了,不用再苦寻民间汉化组了
- 过滤掉URL中的参数部分
- 【文献翻译CVPR2022】SoftGroup for 3D Instance Segmentation on Point Clouds
- 质量指标——什么是增量覆盖率?它有啥用途?