前言
关于LeetCode数组题目的一些方法
一、二分查找
条件:数组一般为有序数组,升序或者降序排列
代码:(数组为a[n])一般数组索引0的位置设为left,数组索引n-1为right,循环条件为left <= right
// 二分查找
while (left <= right){
int mid = left + (right - left) / 2;
if (a[mid] > val){
left = mid + 1;
}
else if (a[mid] < val){
right = mid - 1;
}
else{
a[mid] == val;
}
return left;
}
// 有时用到upper_bound和lower_bound
// upper_bound和lower_bound是直接copy博主负雪明烛的代码
int lower_bound(vector<int>& nums, int target) {
const int N = nums.size();
// [l, r)
int l = 0, r = N;
while (l < r) {
int mid = l + (r - l) / 2;
if (nums[mid] >= target) {
r = mid;
} else {
l = mid + 1;
}
}
return l;
}
int upper_bound(vector<int>& nums, int target) {
const int N = nums.size();
// [l, r)
int l = 0, r = N;
while (l < r) {
int mid = l + (r - l) / 2;
if (nums[mid] <= target) {
l = mid + 1;
} else {
r = mid;
}
}
return l;
}
}
相关题目:
35.搜索插入位置(opens new window)
34.在排序数组中查找元素的第一个和最后一个位置(opens new window)
69.x 的平方根
367.有效的完全平方数
二、快慢指针
一个slowIndex,一个fastIndex,循环条件是slowIndex <= fastIndex(与二分查找类似)
相关题目:
26.删除排序数组中的重复项
283.移动零
844.比较含退格的字符串
977.有序数组的平方
三、滑动窗口(重要)
(设数组啊a[n])有一个指针先移动较快,遇到(最大/最小/不符合要求)条件时停止,另一个较慢的指针开始移动,循环条件是快慢两个指针都小于数组的长度n。通常一开始要设定一个最大值(最小值)的res,然后动态求res的最小(最大)子串或别的东西
经常使用地方:数组、字符串,最长不重复子串,最小覆盖子串。
使用滑动窗口可能会求不重复,子串,或者有限制数组子串元素个数限制的(水果成篮),此时配合unordered_set或者unordered_map使用会更加好。
相关题目:
904.水果成篮(opens new window)
76.最小覆盖子串(opens new window)
3.无重复字符的最长子串
参考
代码随想录
【LeetCode】34. Find First and Last Position of Element in Sorted Array 解题报告(Python & C++)
总结
复习完代码随想录数组部分的一点小总结