力扣刷题笔记1:数组

题目一;搜索插入位置:

 

这是一道很简单的题目,首先想法就是从头到尾遍历数组,直到找到比目标值大的数,返回其在数组中位置-1即可,但是如果目标值在数组最后,时间复杂度就会有你n,所以我使用了二分查找法,可以减少时间复杂度,

代码如下:

class Solution {
public:
    int searchInsert(vector<int>& nums, int target) {
        int n = nums.size();
        int left = 0;//设置左指针
        int right = n - 1; //设置右指针
        while (left <= right) { 
            int middle = left + ((right - left) / 2);
            if (nums[middle] > target) {//如果中间值大于目标值,更新左指针
                right = middle - 1; 
            } else if (nums[middle] < target) {//如果中间值小于目标值,更新右指针
                left = middle + 1; 
            } else { 
                return middle;
            }
        }
         return right + 1;//目标值大于数组中任意数,把目标值插入尾部
    }
};

 题目二;移除元素:

 

 

 这题比较简单,就不做解释,代码如下

 

 

 注意:vector调用erase函数后会返回指向被删除元素的下一个迭代器

 

 题目三;删除排序数组中的重复项:

这道题目和上题很像,我直接放代码了:

 

 

  题目四;有序数组的平方

 

 这道题同样很简单,只需从头到尾遍历数组并求平方,最后调用sort函数即可

代码如下:

 

   题目五;长度最小的子数组:

 

 解题思路和代码如下:

class Solution {
public:
    int minSubArrayLen(int s, vector<int>& nums) {
        int i=0,j=0,temp=0;
        if(!nums.size()) return 0;  //如果数组为空,肯定不满足
        int b=INT_MAX;  //将b定义为整形最大值,用来保存满足条件的子数组大小
        while(j!=nums.size()){  //从头到尾遍历数组并依次累加
            temp+=nums[j];
            j++;
            while(temp>=s)
            {
            b=min(b,j-i);  //如果累加后的结果>=目标值,计算新的子数组大小并和前面保存的b进行比较,将小的那个数值赋值给b
            temp-=nums[i];
             i++;   //从头到尾依次删除子数组中元素,直到累加后结果<目标值,跳出子循环,继续累加
            }
        }
   if(b==INT_MAX) return 0;  //如果此时的b依然还是INT_MAX,就算将数组中的数都相加都不会大于等于目标值,所以返回0;
   else return b;   //此时b就是满足条件的最短数组的长度
   }    
   };

 

 

 

 

 

posted @ 2020-11-18 17:23  伞兵1号  阅读(159)  评论(3)    收藏  举报