【算法训练营day1】数组理论基础 LeetCode704. 二分查找 LeetCode27. 移除元素(二刷)
数组理论基础
数组是存放在连续内存空间上相同数据类型的集合
数组的元素无法删除,只能覆盖
在C++中,二维数组的地址也是连续的
LeetCode704. 二分查找
题目链接:704. 二分查找
独上高楼,望尽天涯路(二刷感受)
能想到使用二分法,但是对于区间的定义没有想清楚
慕然回首,灯火阑珊处(解题方法总结)
使用二分法的前提:
- 有序数组
- 数组中无重复元素
定义target是在一个在左闭右闭的区间里,也就是说每轮while循环都要保证未判定的元素区间应该包含i和j指向的元素,这也是以下几处这样写的原因:while (i <= j)、j = temp - 1、i = 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;
}
};

浙公网安备 33010602011771号