1.二分查找
class Solution{
public:
int search(vector<int> &nums,int target){
int l=0,h=nums.size()-1;
int mid=(l+h)/2;
while (l<=h)
{
if (nums[mid]<target)
{
/* code */
l=mid+1;
}else if (nums[mid]>target)
{
/* code */
h=mid-1;
}else if(nums[mid]==target){
return mid;
}
mid=(l+h)/2;
}
return -1;
}
};
2.移除元素
class Solution{
public:
int removeElement(vector<int> &nums,int val){
int k=0;
for (int i = 0; i < nums.size(); i++)
{
/* code */
if (nums[i]!=val)
{
/* code */
nums[k++]=nums[i];
}
}
return k;
}
};
3.有序数组的平方
class Solution{
public:
vector<int> sortedSquares(vector<int> &nums){
int l=0,h=nums.size()-1;
int k=0;
vector<int> temp(nums.size(),0);
while (l<=h)
{
/* code */
if (nums[l]*nums[l]<nums[h]*nums[h])
{
temp[k++]=nums[l]*nums[l];
l++;
}else{
temp[k++]=nums[h]*nums[h];
h--;
}
}
sort(temp.begin(),temp.end());
return temp;
}
};
解法2
#include <iostream>
#include <string>
#include <vector>
#include<algorithm>
using namespace std;
class Solution{
public:
//双指针
vector<int> sortedSquares(vector<int> &nums){
int l=0,h=nums.size()-1;
int k=h;
vector<int> temp(nums.size(),0);
while (l<=h)
{
/* code */
if (nums[l]*nums[l]>nums[h]*nums[h])
{
temp[k--]=nums[l]*nums[l];
l++;
}else{
temp[k--]=nums[h]*nums[h];
h--;
}
}
return temp;
}
};
5.长度最小的子数组
滑动窗口的思想 满足条件时候 开始滑动 起始位置一直更新
class Solution
{
public:
int minSubArrayLen(int target, vector<int> &nums)
{
int sum = 0;
int min_len = INT32_MAX;
int len = 0;
int l=0;
for (int i = 0; i < nums.size(); i++)
{
sum += nums[i];
if (sum >= target)
{
while (sum >= target)
{
len=i-l+1;
if (len<min_len)
{
min_len=len;
}
sum-=nums[l++];
}
}
}
return min_len==INT32_MAX? 0:min_len;
}
};
6.螺旋矩阵 三遍了
class Solution
{
public:
vector<vector<int>> generateMatrix(int n)
{
vector<vector<int>> temp(n,vector<int>(n,0));
int top = 0, down = n - 1, left = 0, right = n - 1;
int nums = n * n;
int count=1;
int start;
while (count<=nums)
{
start = left;
while (start <= right)
{
temp[top][start]=count++;
start ++;
}
top++;
start = top;
while (start <= down)
{
temp[start][right]=count++;
start ++;
}
right--;
start = right;
while (start >= left)
{
temp[down][start]=count++;
start --;
}
down--;
start = down;
while (start >= top)
{
temp[start][left]=count++;
start --;
}
left++;
}
return temp;
}
};