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

数组学习

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

eg:

数组的下标从0开始,

数组中内存空间的地址是连续的,如上图100 101 102


LeetCode704

解法1:暴力法

思路:遍历数组,寻找target,找到的话返回下标,找不到返回-1

classSolution{public:

    intsearch(vector& nums,int target){

        for(int i = 0;i < nums.size();i++){

            if(nums[i] == target)  return i;

        }

        return -1;

    }

};

解法2:二分法

思路:需注意循环不变量原则,定义好需要查找的空间,每次查找时都遵循这个空间进行。

有两种空间定义方法:[left,right],[left,right)

[left,right]:查找的范围在left-right(包含left,right)

所以当nums[left] > tar时,mid = right - 1

[left,right):查找的范围在left-right(包含left,不包含right)

所以当nums[left] > tar时,mid = right 

程序:

classSolution{public:

    intsearch(vector& nums,inttarget){

        //左闭右闭        

        int left = 0;

        int right = nums.size() - 1;

        while(left <= right){

            int mid = left + (right - left) / 2;

            if(nums[mid] > target){

                right = mid - 1;               

            }

            else if(nums[mid] < target){

                left = mid + 1;

            }

            else if(nums[mid] == target){

                return mid;

            }

        }

        return -1;

    }

};


LeetCode27

思路:双指针法的典型应用

fastIndex用于遍历数组,寻找到满足条件的值后使用slowIndex更新,最后更改数组大小

程序:

class Solution {

public:

    int removeElement(vector& nums, int val) {

        int slowIndex = 0;

        int fastIndex = 0;

        for(;fastIndex < nums.size();fastIndex++){

            if(nums[fastIndex] != val){

                nums[slowIndex++] = nums[fastIndex];

            }

        }

        nums.resize(slowIndex);

        return slowIndex;

    }

};

今日收获:今日题目难度适中,主要学习了双指针法、循环不变量的思想。深入理解了两种定义区间的差别(这是之前刷的时候理解比较模糊的点)。

解题时间较少,深入理解代码、整理博客时间较多,下次精简整理。

学习时间2h。

你可能感兴趣的:(代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素)