知识点 1 :数组理论基础
一维、二维数组内存空间是连续的,位置从0开始,所以删除元素是进行覆盖操作
知识点 2 :二分查找法 704
题型:给定一个有序的数组nums和目标值target,搜索nums中的target,如果存在返回target的下标,如果不存在返回-1.
前提:有序+无重复+搜索
易错:区间边界问题
总结: 左闭右开的写法中,关键是找到一个中间值与目标值进行大小比较
中间值<目标值 :更新左半区间的右边界 middle+1
中间值>目标值:更新右半区间的左边界 middle
知识点 3 :移除元素 27
题型:给定一个数组nums和一个值value ,原地移除所有等于value的值,返回新数组的长度
前提:O(1)
注意:数组是不可以直接删除的,是覆盖
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;//定义慢指针
for(int fast=0;fast<nums.size();fast++)
{
if(nums[fast]!=val)
{
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};
总结:利用双指针的思路,定义快指针fast去寻找新数组的元素,慢指针slow去接收fast更新的值,如果遇到要删除的元素,fast仍然向前移动,但是slow要在原地等待,所以最终的slow就是新数组的长度
题目1 :删除有序数组中的重复项 26
题目2 :移动零 283
题目3 : 比较含退格的字符串 844
题目4 :有序数组的平方 977
class Solution {
public:
vector<int> sortedSquares(vector<int>& nums) {
vector<int> result(nums.size(),0); //定义一个新数组来装平方后的数据
int j=nums.size()-1;
int k=nums.size()-1;//k的下标
for(int i=0,j=nums.size()-1;i<=j;) //注意写法逗号
{
if((nums[i]*nums[i]) < (nums[j]*nums[j])) //右边是最大值 更新右边j
{
result[k]=nums[j]*nums[j];
k--;
j--;
}
else //左边是最大值 更新左边i 可以合并
{
result[k]=nums[i]*nums[i];
k--;
i++;
}
}
return result;
}
};
知识点 4 :长度最小的子数组 209
思想:滑动窗口
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) { //已经有target了
int i=0;
int j=0;
int sum=0;//数组和 在更新
int result=INT32_MAX;//因为数组未知,这是32位系统数组的最大长度 只有最大才能更新length
int length=0;//滑动窗口的长度即要返回的数组长度
for(j=0;j<nums.size();j++)
{
sum=sum+nums[j];//只要for循环一次,j后移一次加sum
while(sum>=target)//只要子数组的元素和大于s 那么移动起始位置使得长度最短
{
length=j-i+1;//滑动窗口长度(终止-起始+1)数组下标从0开始
//result=result < length ? result:length;//要使得数组长度最短那么就要比较
result=min(result,length);
sum=sum-nums[i];
i++;
}
}
return result==INT32_MAX?0:result;//如果result没有被赋值说明找不到子数组返回0,否则返回result
}
};