一、暴力
顺序查找/多层循环/简单模拟/快速排序
二、二分查找
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.size()<=0) return nums.size();
// 二分查找
int left=0;
int right=nums.size()-1;
while(left<=right){
int mid=left+((right-left)>>1);
if(nums[mid]==target) return mid;
else if(nums[mid]<target) left=mid+1;
else right=mid-1;
}
return -1;
}
};
class Solution {
public:
int searchInsert(vector<int>& nums, int target) {
if(nums.size()<=0) return nums.size();
// 二分查找
int left=0;
int right=nums.size()-1;
while(left<=right){
int mid=left+((right-left)>>1);
if(nums[mid]==target) return mid;
else if(nums[mid]<target) left=mid+1;
else right=mid-1;
}
return left;
}
};
34. 在排序数组中查找元素的第一个和最后一个位置 – 力扣(LeetCode)
三、双指针
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
if(nums.size()<=0) return nums.size();
// 前后双指针
int left=0;
int right=0;
while(right<nums.size()){
if(nums[right]!=val){
nums[left++]=nums[right];
}
++right;
}
return left;
}
};
26. 删除有序数组中的重复项 – 力扣(LeetCode)
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size()<=1) return nums.size();
// 前后双指针
int left=0;
int right=1;
while(right<nums.size()){
if(nums[left]!=nums[right]){
nums[++left]=nums[right];
}
++right;
}
return left+1;
}
};
class Solution {
public:
void moveZeroes(vector<int>& nums) {
if(nums.size()<=1) return;
// 将非0元素前移
// 前后双指针
int left=0;
int right=0;
while(right<nums.size()){
if(nums[right]!=0){
nums[left++]=nums[right];
}
++right;
}
// 后续元素置为0
while(left<nums.size()){
nums[left++]=0;
}
return;
}
};
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
if(nums.size()==0) return nums;
vector<int> result(nums.size());
// 相向双指针
int left=0;
int right=nums.size()-1;
for(int i=nums.size()-1;i>=0;--i){
int leftSq=pow(nums[left],2);
int rightSq=pow(nums[right],2);
if(leftSq>rightSq){
result[i]=leftSq;
++left;
}else{
result[i]=rightSq;
--right;
}
}
return result;
}
};
四、滑动窗口
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int minLen=INT_MAX;
// 滑动窗口双指针
int left=0;
int right=0;
int curSum=0;
while(right<nums.size()){
curSum+=nums[right];
while(curSum>=target){
minLen=min(minLen,right-left+1);
curSum-=nums[left++];
}
++right;
}
return minLen==INT_MAX?0:minLen;
}
};
五、矩阵
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n,vector<int>(n));
// 模拟
int north=0,south=n-1;
int west=0,east=n-1;
int elem=1;
while(elem<=n*n){
// 北边界 自西向东
for(int j=west;j<=east && elem<=n*n;++j){
result[north][j]=elem++;
}
++north;
// 东边界 自北向南
for(int i=north;i<=south && elem<=n*n;++i){
result[i][east]=elem++;
}
--east;
// 南边界 自东向西
for(int j=east;j>=west && elem<=n*n;--j){
result[south][j]=elem++;
}
--south;
// 西边界 自南向北
for(int i=south;i>=north && elem<=n*n;--i){
result[i][west]=elem++;
}
++west;
}
return result;
}
};
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int row=matrix.size();
int col=matrix[0].size();
vector<int> result(row*col);
// 模拟
int north=0,south=row-1;
int west=0,east=col-1;
int idx=0;
while(idx<=result.size()-1){
// 北边界 自西向东
for(int j=west;j<=east
&& idx<=result.size()-1;++j){
result[idx++]=matrix[north][j];
}
++north;
// 东边界 自北向南
for(int i=north;i<=south
&& idx<=result.size()-1;++i){
result[idx++]=matrix[i][east];
}
--east;
// 南边界 自东向西
for(int j=east;j>=west
&& idx<=result.size()-1;--j){
result[idx++]=matrix[south][j];
}
--south;
// 西边界 自南向北
for(int i=south;i>=north
&& idx<=result.size()-1;--i){
result[idx++]=matrix[i][west];
}
++west;
}
return result;
}
};