算法10.21

10.21

1.二分查找

c++函数求数组的长度 .size()

middle值作为下标,要放到数组中才能与target值进行比较

class Solution {

public:

  int search(vector<int>& nums, int target) {

​    int middle;

​    int low=0,high=nums.size()-1;

​    while(low<=high){

​      middle=(low+high)/2;

​      if(nums[middle]>target)

​        high=middle-1;

​      else if(nums[middle]<target)

​        low=middle+1;

​      else

​        return middle;

​    }

​    return -1;

  }

};

2.移除元素

i为快指针,j为慢指针;分两种情况,当前快指针没有等于我们定义的值,那就将快指针的值赋给慢指针;当前快指针的值正好等于我们定义的值,那么我们慢指针不动,快指针继续往后查找。这样设计可以将慢指针相当于定位到当前是重复值的第一个位置。

class Solution {

public:

  int removeElement(vector<int>& nums, int val) {//双指针法

​    int i=0,j=0;//i是快指针

​    while(i<nums.size()){

​      if(val!=nums[i])

​        nums[j++]=nums[i];

​      i++;

​    }

​    return j;

  }

};

3.有序数组的平方

vector 是 C++ 标准库中的一个动态数组容器,它可以自动管理内存大小,可以在运行时根据需要动态增长或缩小。它是一个非常常用且强大的容器,用于存储一系列元素。

class Solution {

public:

  vector<int> sortedSquares(vector<int>& nums) {

​    int k=nums.size()-1;//k从数组末尾开始。因为元素平方的最大值一定分布在两边

​    int i=0,j=nums.size()-1;

​    vector<int> result(nums.size(), 0);//创建数组,使用nums.size()个0来初始化。输出是nums.size()个0

​      while(j>=i){

​        if(nums[i]*nums[i]<nums[j]*nums[j]){//元素的最大值在最右边

​          result[k--]=nums[j]*nums[j];

​          j--;

​        }

​         else{//最大值在最左边

​          result[k--]=nums[i]*nums[i];

​          i++;

​        }

​      }

​    return result;

  }

};

posted @ 2023-10-22 11:15  Ref-rain-  阅读(10)  评论(0)    收藏  举报