文章链接
数组是存放在连续内存空间上的相同类型数据的集合。
下标索引的方式获取到下标下对应的数据。
特点:
1.下标都是从0开始的。
2.内存空间的地址是连续的。
是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址;
是连续的,所以数组的元素是不能删的,只能覆盖。
文章链接
手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找
熟悉根据 “左闭右开”,“左闭右闭” 两种区间规则 写出来的二分法。
其实是一种定边界的思想,能够很好的帮助我们确定<还是<=,以及+1或者-1。
定了一种思想,就从一而终。
【左闭右开】
/*** @param {number[]} nums* @param {number} target* @return {number}*/
var search = function(nums, target) {let left= 0;let right = nums.length;while (left < right) {let middleIndex = left + (right - left >> 1);let middle = nums[middleIndex];if (middle < target) {left = middleIndex + 1;} else if (middle > target) {right = middleIndex;} else {return middleIndex;} }return -1;
};
【左闭右闭】
/*** @param {number[]} nums* @param {number} target* @return {number}*/
var search = function(nums, target) {let left= 0;let right = nums.length - 1;while (left <= right) {let middleIndex = left + (right - left >> 1);let middle = nums[middleIndex];if (middle < target) {left = middleIndex + 1;} else if (middle > target) {right = middleIndex - 1;} else {return middleIndex;} }return -1;
};
文章讲解
视频讲解
题目比较简单,但是比较考验对数组底层原理理论的理解。
其实数组物理空间是无法删除的,只是后一位移动覆盖。
题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。
双指针法 是本题的精髓。 库函数是不推荐在学算法时候使用的。
【暴力解】
一层for循环用于遍历数组元素
二层for循环用于更新数组
/*** @param {number[]} nums* @param {number} val* @return {number}*/
var removeElement = function(nums, val) {let size = nums.length;for (let i = 0; i < size; i++) {if (nums[i] === val) {for (let j = i + 1; j < size; j++) {nums[j-1] = nums[j];}i--;size--;}}return size;
};
【双指针】
快慢指针,均是从0开始
slow慢指针:用于指向更新后的数组的下标的位置(“坑”)
quick快指针:用于寻找新数组中的元素(“萝卜”)
/*** @param {number[]} nums* @param {number} val* @return {number}*/
var removeElement = function(nums, val) {let slow = 0;for (let quick = 0; quick < nums.length; quick++) {if (nums[quick] != val) {nums[slow] = nums[quick];slow++;}}return slow;
};