代码随想录day01 | 704. 二分查找,27. 移除元素
704. 二分查找
题目连接:
解题思路:
1.二分法的基本思想,确定数组的边界是左闭右闭即[left, right],或者左闭右开即[left, right)。必须要坚持区间的开闭原则!!!!
2.进行循环,确定循环停止的条件
3.取中间值的下标方法是 let mid = ~~(left+(right - left)/2),再判断中间值和目标值的大小,进行赋值操作。如果等于目标值,直接返回下标
两种版本的代码:
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let length = nums.length
let left = 0
let right = length-1
// 定义target在左闭右闭的区间里,[left, right]
while(left <= right) {// 当left==right,区间[left, right]依然有效,所以用 <=
let mid = ~~((left + right)/2)
if(target < nums[mid]) {
right = mid-1// target 在左区间,所以[left, mid- 1]
} else if(target > nums[mid]) {
left = mid+1// target 在右区间,所以[mid+ 1, right]
} else { // nums[mid] == target
return mid// 数组中找到目标值,直接返回下标
}
}
// 未找到目标值
return -1
}
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var search = function(nums, target) {
let length = nums.length
let left = 0
let right = length-1
// 定义target在左闭右开的区间里,即:[left, right)
while(left < right) {// 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
let mid = ~~((left + right)/2)
if(target < nums[mid]) {
right = mid// target 在左区间,在[left, mid)中
} else if(target > nums[mid]) {
left = mid+1// arget 在右区间,在[mid+ 1, right)中
} else { // nums[mid] == target
return mid// 数组中找到目标值,直接返回下标
}
}
// 未找到目标值
return -1
}
重点
确定了一个区间的形式,一定要严格遵守区间来进行边界的处理!!
收获
掌握了二分查找两种边界状态的实现代码
27. 移除元素
题目连接:
解题思路:
1.移动数组:使用快慢指针的方法解题
代码
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
//自己写的不用双指针的方法
var removeElement = function(nums, val) {
for(let i=0; i<nums.length; i++) {
if(nums[i] === val) {
nums.splice(i,1)
i--
continue;
}
}
return nums.length
};
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
//时间复杂度:O(n)
//空间复杂度:O(1)
//使用双指针(快慢指针)的方法
var removeElement = (nums, val) => {
let k = 0;
for(let i = 0;i < nums.length;i++){
if(nums[i] != val){
nums[k++] = nums[i]
}
}
return k;
};
重点
1.数组按照下标的位置进行裁剪的方法是array.splice(start[, deleteCount[, item1[, item2[, …]]]])
2.使用双指针的方法,可以在原数组上修改
收获
很多考察数组、链表、字符串等操作的面试题,都使用双指针法。