算法入门2——双指针
双指针有三种,快慢指针,对撞指针,滑动窗口,说是指针其实也不是完全是指针形式,可以是下标,也可以是两个标志位的移动,记录leecode的双指针的例题,其实现实做题中肯定也是有用到类似形式,只是不知道是双指针,leecode的这一例题,主要学习到数组反转的妙用,虽然数组反转的空间复杂度下降,但是却没有直接在开辟一个数组执行的时间快,我自己写了两三次这一题,两次都是超时。
例题如下:原题传送门
我之前写的超时的。。。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size()-1;
int i,j,p;
int tmp;
for(i = 1;i <= k;i++)
{
tmp = nums[n];
for(j = n,p = n-1;j>=1,p>=0;j--,p--)
{
nums[j]=nums[p];
}
nums[0]=tmp;
}
}
};
成功通过的,(参考官方解法)
class Solution {
public:
// //法1:翻转数组
// void reserve(vector<int>& nums,int begin,int end){
// while(begin<end)
// {
// swap(nums[begin],nums[end]);
// begin++;
// end--;
// }
// }
// void rotate(vector<int>& nums, int k) {
// k = k%nums.size();
// reserve(nums,0,nums.size()-1);
// reserve(nums,0,k-1);
// reserve(nums,k,nums.size()-1);
// }
//法2:
void rotate(vector<int>& nums, int k) {
vector<int> arr(nums.size());
for(int i = 0 ;i<nums.size();i++)
{
arr[(i+k)%nums.size()] = nums[i];
}
nums.assign(arr.begin(),arr.end());
}
};
解法2比解法1快了一倍。