算法学习笔记——专题拓展2:数组双指针经典习题

关于数组的技巧有:双指针(快慢指针(时差、位差))

例题1:合并两个有序数组

代码:逆向双指针,可以不用重开数组,如果是正向的,需要重开一个数组腾空间。

class Solution {
public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {int p1 = m-1, p2 = n-1, p = m+n-1;while(p1 >= 0 && p2 >=0){if(nums1[p1] > nums2[p2]){nums1[p--] = nums1[p1--];}else{nums1[p--] = nums2[p2--];}}while(p1 >= 0){nums1[p--] = nums1[p1--];}while(p2 >= 0){nums1[p--] = nums2[p2--];}}
};

还有一个方法是把nums2数组搬进去,然后sort,但是太简单了,并且时空复杂度比这个高。

例题2:有序数组的平方

代码

思路1:平方后sort

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int n  = nums.size();for(int i = 0; i< n; i++){nums[i]  = nums[i] * nums[i];}sort(nums.begin(), nums.end());return nums;}
};

 注意:for (int num : nums)得到的是拷贝,所以不能够修改原数组

思路2:双指针,找到正负分界线

class Solution {
public:vector<int> sortedSquares(vector<int>& nums) {int pos = 0;int n = nums.size();vector<int> ans;if(n == 0){return ans;}while( pos < n && nums[pos] < 0){pos++;}int left = pos-1, right = pos;while(left >= 0 && right < n){if(-nums[left] < nums[right]){ans.push_back(nums[left] * nums[left]);left--;}else{ans.push_back(nums[right] * nums[right]);right++;}}while(left >= 0){ans.push_back(nums[left] * nums[left]);left--;}while(right < n){ans.push_back(nums[right] * nums[right]);right++;}return ans;}
};

注意点:边界情况是>还是>=, pos<n && nums[pos] <0的顺序(不然会引用非法指针) 

例题3:反转字符串中的单词

分析:从末尾开始,两个指针,一快一慢,夹紧一个单词的边界,把它拎出来放到ans字符串里面。最后通过resize裁剪去末尾的空格即可。

因为两边界可能有空格或者没有,但是到最后如果没有边界,需要出while循环单独判断,所有把S两边加上’  ‘把问题简化,这种化归的思想很有用处。

代码

class Solution {
public:string reverseWords(string s) {//算法1:快慢指针string ans; s = ' ' + s + ' ';int fast = s.size() -1, slow = s.size()-1;int wordLength;while(fast >= 0){if(s[fast] == ' '){fast--;}else{slow = fast;//进入单词了,遍历完再出来while(s[fast] != ' '){fast--;}//刚好出单词  "string string 1string2  "wordLength = slow - fast;ans += s.substr(fast+1, wordLength) + ' ';slow = fast;}}ans.resize(ans.size() -1);return ans;}
};

 总结

i)对迭代器的增减不会改变数组的长度。

ii)截取字符串用 s.substr( begin, length); 选取区间是[begin, begin + length), 拼接字符串简单的+就可以。

iii)string中的erase:

按位置删除:s.erase(int ),直接从第int个位置删除,并且截断字符串(后面的不看了)

按位置和长度删除多个字符: s.erase(n, len), 从 n开始删除 len个,不截断,保留后面的。

例题4:二维网格迁移

代码

思路1:开一个新数组,然后转移过去,需要用 cnt 来计算新数组对应原数组的位置,cnt/n为行, cnt%n 为列。

class Solution {
public:vector<vector<int>> shiftGrid(vector<vector<int>>& grid, int k) {int m = grid.size(), n = grid[0].size();int mul = m*n;k %= mul;vector<vector<int>> copy(m, vector<int>(n));int cnt = (mul - k)%mul;for(int i = 0; i < m; i++){for(int j = 0; j< n; j++){copy[i][j] = grid[cnt/n][cnt%n];cnt = (cnt+1)%mul;}}return copy;}
};

总结

一般代码出了匪夷所思的问题,都是边界问题没有处理好。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/9.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图书借阅系统开发笔记

图书借阅系统开发介绍及心得 项目已开源到 github https://github.com/Qiu-JW/books-manage-systemgitee https://gitee.com/qiu-jw/books-manage-system 技术栈 前端 HTML5、CSS、JS、jQuery、axios、bootstrap 后端 servlet、JSP、JDBC 数据库 MySQL 项目采用mvc模式构成 …

Java的数组定义和使用

目录 1.前言 2.数组的概念 3.在Java中的创建和初始化 3.1数组的创建 3.2数组的初始化 4.关于使用 4.1数组元素的访问 4.2数组的遍历 4.3length和length()的区别 5.数组其实是引用类型数据 5.1初始JVM的内存分布 5.2基本类型变量与引用类型变量的区别 5.3关于null的认识 5.4设计…

手眼标定(外参)

1. 传统使用张正友相机标定,角点检测 //张正友相机标定,角点检测 for(int i=1;i<=images_number;i++){Mat image=imread(images_path+to_string(i)+String("/color.jpg"));Mat output=image.clone();image_size.width=image.cols;image_size.height=image.…

(34)4.17 作业课

//弓箭型 int main() { int n 0; while (scanf("%d", &n) 1) { int i 0; for (i 0; i < n; i) { int j 0; for (j 0; j < n - i; j) { printf(" &q…

工作流JBPM画图与配置

文章目录 ☃️7.1 画图☃️7.2 配置7.2.1 配置任务办理人7.2.1.1 写死的方式配置任务办理人&#xff08;不推荐&#xff09;7.2.1.2 #{}方式配置任务办理人7.2.1.3 实现接口方式配置任务办理人7.2.1.4 方法指定方式分配任务办理人 7.2.2 配置节点属性7.2.2.1 判断节点(decision…

Sourcetree安装使用(补个笔记)

Sourcetree介绍 Sourcetree是一款免费的Git图形化客户端&#xff0c;它由Atlassian开发&#xff0c;提供了跨平台的支持&#xff0c;可运行在Windows和Mac操作系统上。Sourcetree可以让开发者更方便地使用Git来管理代码&#xff0c;不需要在命令行中输入复杂的Git命令&#xf…

symfony框架介绍

Symfony是一个功能强大的PHP框架,它提供了丰富的组件和工具来简化Web开发过程。以下是一些关于Symfony的主要特点: 可重用性: Symfony提供了一系列可重用的PHP组件,这些组件可以用于任何PHP应用程序中。灵活性: Symfony允许开发者根据项目需求灵活选择使用哪些组件,而不是强…

HTML学习笔记:链接target属性

关于target的使用&#xff1a; <a href"https://www.baidu.com" target"_parent">网址链接</a>其中关于target四个特殊目标的理解&#xff0c;W3school上的解释为&#xff1a; HTML 标签的 target 属性 其中_black和_self两个属性很好理解&…