专题:数组(已完结)

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指针遍历数组numsi 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

相关推荐
见过夏天3 小时前
C++ 基础入门完全指南
c++
用户805533698031 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK2 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境2 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境2 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴3 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境5 天前
C++ 的Eigen 库全解析
c++
卷无止境5 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴5 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18007 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝