如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的
题号:81
//利用map这样又太简单了应该不会让这样
var search = function (nums, target) {
let map = new Map()
nums.forEach((item) => {
map.set(item, 1)
});
return map.has(target)
};
//复习二分查找
//一般有序数组中找目标要想到二分查找
//当想到二分查找就要时刻注意细节问题
var search = function (nums, target) {
//先把数组调整为升序
nums.sort((a, b) => {
return a - b
})
//升序完开始二分搜索
let left = 0, right = nums.length - 1
while (left <= right) {
let mid = Math.floor(left + (right - left) / 2)
if (nums[mid] == target) {
//找到
return true
} else if (nums[mid] > target) {
right = mid - 1
} else {
left = mid + 1
}
}
return false
}
题号:153
var findMin = function (nums) {
//一个元素直接返回
if (nums.length == 1) {
return nums[0]
}
//首尾比较观察是否就是有序数组,是就返回首元素
if (nums[0] < nums[nums.length - 1]) {
return nums[0]
}
//走到这里说明nums符合一个特性:从首元素开始升序然后到某个元素开始出现一个拐点
//那个拐点之后第一个元素就是要找的值
let left = 0, right = nums.length - 1
while (left <= right) {
let mid = Math.floor(left + (right - left) / 2)
if (nums[mid] < nums[mid - 1]) {
//mid指向的元素如果小于前一个元素,那么此时mid就是要找的最小值
return nums[mid]
} else {
//收缩范围
//mid指向的元素大于nums的尾元素那么说明要找的值落在拐点右边去右边找
//反之落在左边
if (nums[mid] > nums[nums.length - 1]) {
left = mid + 1
} else {
right = mid - 1
}
}
}
};
题号:剑指offer11
//此类题首先想到在数组内有一个拐点
var minArray = function (numbers) {
let left = 0, right = numbers.length - 1
while (left <= right) {
let mid = Math.floor(left + (right - left) / 2)
if (numbers[mid] > numbers[right]) {
//此种情况拐点一定在mid右边
left = mid + 1
} else if (numbers[mid] < numbers[right]) {
//此种情况拐点一定在mid左边或者是mid(所以不能mid-1)
right = mid
} else {
//此种情况有点复杂,我不能断定拐点在mid左还是右
//我如果断定在左的话,可以举一个例子推翻:2,2,2,2,5,1,2,2
//我如果断定在右的话,可以举一个例子推翻:2,2,2,2,5,2,2
//那么此时此刻我能做啥?
//我把right缩小1,缩小一个范围继续搜索,因为我能保证我缩小这1个范围之后要找的结果还在区间内
right--
}
}
return numbers[left]
};