代码随想录算法训练营第一天 | Leetcode704.二分查找、Leetcode27.移除元素

代码随想录算法训练营第一天 | Leetcode704.二分查找、Leetcode27.移除元素

  • 数组理论基础
  • Leetcode704.二分查找
  • Leetcode27.移除元素

数组理论基础

文章链接:数组理论基础

定义:数组是存放在连续内存空间上的相同类型数据的集合。

性质1.下标从0开始、2.内存空间连续、3.数组元素无法删除,只能覆盖

注意:C++中vector的底层是array实现的,本质上是容器而不是数组;在C++中二维数组在地址空间上是连续的

Leetcode704.二分查找

题目链接:Leetcode704.二分查找
个人比较喜欢用的二分法左闭右闭式写法:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int start=0;
        int end=nums.size()-1;
        while(start<=end){
            int middle=start+(end-start)/2;
            if(nums[middle]>target) end=middle-1;
            if(nums[middle]<target) start=middle+1;
            if(nums[middle]==target) return middle;
        }
        return -1;
    }
};

主要思路在于while的判出条件为start>end,就是超限了,实现方式在于让二者等于middle+1/-1不是直接等于middle
要注意得用middle=start+(end-start)/2,防止end比较大导致溢出
代码随想录算法训练营第一天 | Leetcode704.二分查找、Leetcode27.移除元素_第1张图片

Leetcode27.移除元素

题目链接:Leetcode27.移除元素
暴力解法,思路是真的简单,直接原地覆盖就得了

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int result=nums.size();
        for(int i=0;i<result;i++){
            if(nums[i]==val){
                for(int j=i;j<result-1;j++){
                    nums[j]=nums[j+1];
                }
                result--;
                i--;
            }
        }
    return result;
    }
};

不过最大的弊病在于**O(n^2)**的时间复杂度,试试快慢指针,快指针遇到target直接+1就行,用快指针替代一个for循环

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int fast=nums.size();
        for(int slow=0;slow<fast;slow++){
            if(nums[slow]==val){
                nums[slow]=nums[fast-1];
                fast--;
                slow--;
            }       
        }
    return fast;
    }
};

采用了直接覆盖当前位置的方法,不仅时间复杂度O(n),而且减少了每次的覆盖次数,时间复杂度更低

你可能感兴趣的:(算法,leetcode,数据结构)