专题:数组(已完结)

1.二分查找

有两种写法

第一种:左闭右闭

第二种:左闭右开

两种方法注意初始化 right的不同 以及更新right的不同

第一种:

cpp 复制代码
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size()-1;
        while(left<=right){
            int mid = (left+right)/2;
            if(target>nums[mid]){
                left=mid+1;
            }else  if(target<nums[mid]){
               right=mid-1;;
            }else{
                return mid;
            }

        }
        return -1;
    }
};

第二种:

cpp 复制代码
class Solution {
public:
    int search(vector<int>& nums, int target) {
        int left = 0;
        int right = nums.size();
        while(left<right){
            int mid = (left+right)/2;
            if(target>nums[mid]){
                left=mid+1;
            }else  if(target<nums[mid]){
               right=mid;;
            }else{
                return mid;
            }

        }
        return -1;
    }
};

2.移除元素

这里用快慢指针

slowindex 指向将要填的位置

cpp 复制代码
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowindex =0;
        int fastindex =0;
        for(int fastindex =0;fastindex<nums.size();fastindex++){
           if(nums[fastindex]!=val){
             nums[slowindex] = nums[fastindex];
             slowindex++;
           }
        }
        return slowindex;
    }
};

3.有序数组的平方

用双指针 i,j i指向头 j指向尾 平方后比较大小 大的直接放到新的数组中 新数组从尾部开始放

cpp 复制代码
        int i=0;
        int j=nums.size()-1;

完整代码

cpp 复制代码
class Solution {
public:
    vector<int> sortedSquares(vector<int>& nums) {
        int i=0;
        int j=nums.size()-1;
        int k =nums.size()-1;
        vector<int> result(nums.size(),0);
        while(i<=j){
            if(pow(nums[i],2) >pow(nums[j],2) ){
                result[k] = nums[i]*nums[i];
                k--;
                i++;
            }else{
                result[k] = nums[j]*nums[j];
                k--;
                j--; 
            }
        }
        return result;
    }
};

4.长度最小的子数组

需要

使用双指针法 j指针遍历数组nums[i] j管理右边界 每次遍历都加一,low管理左边界 左边界需要判断sum是否符合条件 因此左边界可能不止加一。

cpp 复制代码
class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
    int i=0;
    int sum = 0;
    int minlen =INT_MAX;
    for(int j=0;j<nums.size();j++){
      sum=sum+nums[j];
      while(sum>=target){
        minlen=min(minlen,j-i+1);
        sum=sum-nums[i];
        i++;
      }
    }
    return minlen==INT_MAX? 0:minlen;
    }
};

5.螺旋矩阵II

相关推荐
EmbedLinX10 分钟前
C++ 面向对象
开发语言·c++
weixin_4454023017 分钟前
C++中的命令模式变体
开发语言·c++·算法
Hgfdsaqwr25 分钟前
实时控制系统优化
开发语言·c++·算法
CSDN_RTKLIB25 分钟前
Visual Studio不改变文件编码情况下解决C2001
c++·ide·visual studio
D_evil__41 分钟前
【Effective Modern C++】第三章 转向现代C++:15. 尽可能使用constexpr
c++
2301_821369611 小时前
嵌入式实时C++编程
开发语言·c++·算法
sjjhd6521 小时前
多核并行计算优化
开发语言·c++·算法
田野追逐星光1 小时前
STL的容器vector的模拟实现
开发语言·c++
Tansmjs2 小时前
实时数据可视化库
开发语言·c++·算法
WBluuue2 小时前
Codeforces 1075 Div2(ABC1C2D1D2)
c++·算法