Loading

【算法训练营day1】数组理论基础 LeetCode704. 二分查找 LeetCode27. 移除元素(二刷)

数组理论基础

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

数组的元素无法删除,只能覆盖

在C++中,二维数组的地址也是连续的


LeetCode704. 二分查找

题目链接:704. 二分查找

独上高楼,望尽天涯路(二刷感受)

能想到使用二分法,但是对于区间的定义没有想清楚

慕然回首,灯火阑珊处(解题方法总结)

使用二分法的前提:

  • 有序数组
  • 数组中无重复元素

定义target是在一个在左闭右闭的区间里,也就是说每轮while循环都要保证未判定的元素区间应该包含i和j指向的元素,这也是以下几处这样写的原因:while (i <= j)j = temp - 1i = temp + 1

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

LeetCode27. 移除元素

题目链接:27. 移除元素

独上高楼,望尽天涯路(二刷感受)

用的暴力解法,一开始没有想到随着元素被移除,i和nums_size都需要同步更新

慕然回首,灯火阑珊处(解题方法总结)

暴力解法:

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

双指针法:

双指针法(快慢指针法)指的是通过快指针和慢指针在一个for循环下完成两个for循环的工作

快慢指针的作用:

  • 快指针:寻找旧数组中与目标元素值不相等的元素,每轮for循环都更新
  • 慢指针:用来表示新数组的长度,指向新数组的末尾,仅当快指针找到与目标元素值不相等的元素时才更新
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slow = 0;
        for (int fast = 0; fast < nums.size(); fast++) {
            if (nums[fast] != val) {
                nums[slow] = nums[fast];
                slow++;
            }
        }
        return slow;
    }
};
posted @ 2022-10-12 13:34  BarcelonaTong  阅读(265)  评论(0)    收藏  举报