Day01 数组part01
学习内容:
- 数组理论基础 programmercarl.com/%E6%95%B0%E…
- 704.二分查找
- 27.移除元素
- 977.有序数组的平方
704 二分查找
要学会左闭右闭,左闭右开,两种写法。
- 习惯性写出的是左闭右闭的写法:
var search = function (nums, target) {
let left = 0;
let right = nums.length - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (nums[mid] == target) return mid;
else if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
}
}
return -1;
};
-
左闭右开
let left = 0; let right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)- 由于选定区间左闭右开,则
left == right无意义,因此循环条件应为while(left<right) - 向左区间寻找时,该区间不再包含
nums[mid],因此可以直接写成right=mid,不用mid-1。
- 由于选定区间左闭右开,则
27 移除元素
- 使用双指针。
- 总体思路就是当
快指针值==val时,慢指针原地等待,等到快指针值!=val时,用它覆盖慢指针,并向前移动慢指针。 - 当快指针指到末尾时,慢指针以前的元素就是数组里全部
值!=val的元素了,我们不在乎慢指针之后的值是什么。
977 有序数组的平方
学习感悟:
- 数组其实是有序的, 只不过负数平方之后可能成为最大数了。
- 那么数组平方的最大值就在数组的两端,不是最左边就是最右边,不可能是中间。
var sortedSquares = function (nums) {
let left = 0,
right = nums.length - 1;
let res = Array.from({ length: nums.length });
for (let i = res.length - 1; i >= 0; i--) {
if (nums[left] * nums[left] >= nums[right] * nums[right]) {
res[i] = nums[left] * nums[left];
left++;
console.log(res[i]);
} else {
res[i] = nums[right] * nums[right];
right--;
console.log(res[i]);
}
}
return res;
};