专题:数组(已完结)

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

略

相关推荐
丰色木夕6 小时前
Ubuntu22.04下源码编译安装USD-Brep
c++·ubuntu·nvidia·usd-brep
衍玊9 小时前
多路转接原理与应用
c++
himobrinehacken10 小时前
位运算揭秘:左右移与符号位陷阱
c语言·c++·算法·安全
Android小码家13 小时前
Vehicle 实战 自定义属性+测试demo
java·c++·framework·vhal·vehicle
hetao173383713 小时前
2026-10-19 hetao1733837 的刷题记录
c++·算法
夏虫不可与之言冰13 小时前
第三课 点亮 LED 与定时器非阻塞闪烁
c语言·c++·vscode·单片机·嵌入式硬件·物联网
辛苦才能13 小时前
C++ 哈希表深度解析:删除为什么必须打标记,负载因子为什么卡 0.7
开发语言·数据结构·c++·算法
miller-tsunami14 小时前
STL简介&string相关知识点
开发语言·c++·string
坤坤子吖14 小时前
Linux 线程同步与互斥——互斥锁
linux·服务器·c++·笔记·学习
TDTC_XQ14 小时前
Linux网络编程accept的讲解
linux·服务器·c++