Leetcode 704.二分查找
题目:704. 二分查找
初始思路
标准的二分查找,题目已经升序排列好元素。
先定义好初始区间,当中值小于目标值时,转移到右半区间查找,反之转移到左半区间查找。
找到的话就返回mid值,找不到的话就返回-1
代码
// 第一种:定义 target 是在一个在左闭右闭的区间里,也就是[left, right]
var search = function (nums, target) {
let left = 0
let right = nums.length - 1
while (left <= right) {
// let mid = Math.floor((left + right) / 2)
let mid = Math.floor(left + ((right - left) / 2)) // 防止left+right加起来溢出
if (nums[mid] < target) {
left = mid + 1
} else if (nums[mid] > target) {
right = mid - 1
} else {
return mid
}
}
return -1
};
// 第二种:定义 target 是在一个在左闭右开的区间里,也就是[left, right)
var search = function (nums, target) {
let left = 0
let right = nums.length // 因为右边是开区间所以不用-1
while (left < right) {
let mid = Math.floor(left + ((right - left) / 2))
if (nums[mid] > target) {
// target 在左区间,在[left, middle)中
right = mid
} else if (nums[mid] < target) {
// target 在右区间,在[middle + 1, right)中
left = mid + 1
} else {
return mid
}
}
return -1
}
感想
- 一开始总是调试不成功,后来发现是mid的问题,除了之后变成了小数,需要用floor方法向下取整,是JS语言特有问题。
- 同时也要注意while里面条件的判断,是否要带等于符号。
- 之前一直写的都是第一种方法(左右都闭)的方法,今天补充了第二种写法(左闭右开)。
Leetcode 27.移除元素
题目:27. 移除元素
初始思路
因为之前写过一部分题目,第一反应就是使用双指针,但是想法仍然是后一个元素覆盖前一个元素,没有领悟到双指针的精髓,写起来还是错的。
代码
// 暴力解法
var removeElement = function (nums, val) {
let n = nums.length
for (let i = 0; i < n; i++) {
if (nums[i] == val) {
for (let j = i + 1; j < n; j++) {
nums[j - 1] = nums[j]
}
i--
n--
}
}
return n
}
// 双指针写法
var removeElement = function (nums, val) {
let left = 0
for (let right = 0; right < nums.length; right++) {
// right遍历整个数组,当与val不相等的时候赋值,并移动Left指针
// 如果相等的话就不移动left指针
if (nums[right] != val) {
nums[left] = nums[right]
left++
}
}
return left
}
感想
- 还是首先掌握暴力解法,当双指针解法卡壳的时候首先还是要用暴力解法做出来。
- 双指针解法中:right指针用于遍历整个数组元素,用来查找是否与val相等。
当right指针所对应的值不是val时,就用left指针更新数组。
如果right指针所对应的值是val,right指针继续向后查找,left指针留在原地,等待下次更新。
- 要多多练习双指针的题目,理解双指针的思想。