Day01: 704.二分查找、 27.移除元素

文章目录

  • 前言
  • 704.二分法
  • 27.移除元素
  • 总结

前言

关于二分法以及一维数组元素移除的一些知识点总结。


704.二分法

前提:

  • 有序数组
  • 数组元素不重复
  • 注意区间

力扣题目链接

易错点:

1.左闭右闭区间

  1. 循环条件left <= right允许成立
  2. 当left>mid,left == mid+1;当right
  3. right==num.size()-1

2.左闭右开区间

  1. 循环条件left < right
  2. 当left>mid,left == mid+1;当eight
  3. right==num.size()

3.其他问题

  •  最好用mid == left+(right-left)/2,防止整型溢出。

        

27.移除元素

力扣题目链接

注意:数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

1.暴力法

两个for循环,一个查找,一个覆盖

// 时间复杂度:O(n^2)
// 空间复杂度:O(1)
class Solution {
public:
    int removeElement(vector& nums, int val) {
        int size = nums.size();
        for (int i = 0; i < size; i++) {
            if (nums[i] == val) { // 发现需要移除的元素,就将数组集体向前移动一位
                for (int j = i + 1; j < size; j++) {
                    nums[j - 1] = nums[j];
                }
                i--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
                size--; // 此时数组的大小-1
            }
        }
        return size;

    }
};

暴力法易理解但浪费时间。


2.双指针法

一个快指针查找,一个慢指针覆盖

1.同向指针

// 时间复杂度:O(n)
// 空间复杂度:O(1)
//同向指针
class Solution {
public:
    int removeElement(vector& nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            if (val != nums[fastIndex]) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
};

2.双向指针 

/**
* 相向双指针方法,基于元素顺序可以改变的题目描述改变了元素相对位置,确保了移动最少元素
* 时间复杂度:O(n)
* 空间复杂度:O(1)
*/
class Solution {
public:
    int removeElement(vector& nums, int val) {
        int leftIndex = 0;
        int rightIndex = nums.size() - 1;
        while (leftIndex <= rightIndex) {
            // 找左边等于val的元素
            while (leftIndex <= rightIndex && nums[leftIndex] != val){
                ++leftIndex;
            }
            // 找右边不等于val的元素
            while (leftIndex <= rightIndex && nums[rightIndex] == val) {
                -- rightIndex;
            }
            // 将右边不等于val的元素覆盖左边等于val的元素
            if (leftIndex < rightIndex) {
                nums[leftIndex++] = nums[rightIndex--];
            }
        }
        return leftIndex;   // leftIndex一定指向了最终数组末尾的下一个元素
    }
};

注:以上代码均来自代码随想录


总结

因为昨天已经刷过这两道题了,没有记录时间。不仅是第一次写博客,更是第一次下定决心要努力改变自己,坚持坚持坚持!

你可能感兴趣的:(leetcode)