- 34.在排序数组中查找元素的第一个和最后一个位置
- 35.搜索插入
- 69.x的平方根
- 875.爱吃香蕉的珂珂
34.在排序数组中查找元素的第一个和最后一个位置
clike
复制代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
// 思路
// 新建一个search函数,参数为是否查找第一个, true第一个 false 最后一个
// 普通二分左闭右开查找
// 当等于target时, 查找第一个,right继续前移, 查找最后一个 left继续后移,不移动会死循环
var searchRange = function (nums, target) {
let firstIndex = -1;
let lastIndex = -1;
seach(true);
seach(false);
console.log([firstIndex, lastIndex]);
function seach(isFindFirst) {
let left = 0;
let right = nums.length;
while (left < right) {
let mid = Math.floor((left + right) / 2);
if (nums[mid] === target) {
if (isFindFirst) {
firstIndex = mid;
// right = mid;
} else {
lastIndex = mid;
// left = mid + 1;
}
} else if (nums[mid] > target) {
right = mid;
} else {
left = mid + 1;
}
}
}
};
searchRange([5, 7, 7, 8, 8, 10], 8);
// 输入:nums = [5,7,7,8,8,10], target = 8
// 输出:[3,4]
35.搜索插入
clike
复制代码
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
// 左闭右开 套路 left<right right = mid left = mid+1
// 如果没有找到在最后一个right的位置上+1, 不是左+1
var searchInsert = function (nums, target) {
let left = 0;
let right = nums.length;
let ans = -1;
while (left < right) {
let mid = Math.floor((left + right) / 2);
if (nums[mid] > target) {
right = mid;
} else if (nums[mid] === target) {
ans = mid;
break;
} else {
left = mid + 1;
}
}
ans = ans === -1 ? right : ans;
// console.log(ans);
// console.log(left);
return ans;
};
searchInsert([1, 3, 5, 6], 5);
searchInsert([1, 3, 5, 6], 2);
// 输入: nums = [1,3,5,6], target = 5
// 输出: 2
// 输入: nums = [1,3,5,6], target = 2
// 输出: 1
69.x的平方根
clike
复制代码
/**
* @param {number} x
* @return {number}
*/
// 思路
// 使用二分获取到数的一半 来相乘,来区分条件
// while left<=right
// 二分指针更改条件 是小于等于x left+=1 ans=mid 大于x right=mid-1
var mySqrt = function (x) {
let left = 0;
let right = x;
let ans = -1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (mid * mid <= x) {
ans = mid;
left += 1;
} else {
right = mid - 1;
}
}
// console.log(ans);
return ans;
};
mySqrt(4);
mySqrt(8);
875.爱吃香蕉的珂珂
clike
复制代码
/**
* @param {number[]} piles
* @param {number} h
* @return {number}
*/
// 左闭右开
var minEatingSpeed = (piles, h) => {
let left = 0;
let right = Math.max(...piles) + 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (check(mid) <= h) {
right = mid;
} else {
left = mid + 1;
}
}
console.log(left);
return left;
function check(speed) {
return piles.reduce((x, y) => x + Math.ceil(y / speed), 0);
}
};
getSum([3, 6, 7, 11], 8);
getSum([30, 11, 23, 4, 20], 5);
// 输入:piles = [3,6,7,11], h = 8
// 输出:4