一、LC第35题
搜索插入位置
1 暴力插入(时间击败92%)时间复杂度O(n)
var searchInsert = function(nums, target) {
for (let i = 0; i < nums.length; i++) {
if (nums[i] >= target) {
return i;
}
}
return nums.length;
}
2 二分查找第一种写法 左闭右闭(时间击败80%) 时间复杂度O(logn)
var searchInsert = function(nums, target) {
let left = 0, right = nums.length - 1;
while(left <= right) {
let mid = left + Math.floor((right - left) / 2);
if (nums[mid] > target) {
right = mid - 1;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
return mid;
}
}
return right + 1;
}
3 二分查找第二种写法 左闭右开(时间击败46%)时间复杂度O(logn)
var searchInsert = function(nums, target) {
let left = 0, right = nums.length;
while(left < right) {
let mid = left + Math.floor((right - left)/2);
if (nums[mid] > target) {
right = mid;
} else if (nums[mid] < target) {
left = mid + 1;
} else {
return mid;
}
}
return right;
}
二、LC第34题
逆天解法,实在是太艹了。
var searchRange = function(nums, target) {
return [nums.indexOf(target), nums.lastIndexOf(target)];
};
哈哈哈,看完上面这个,是不是被自己的智商蠢到了?
继续看下面的吧。 (时间击败80%) 时间复杂度O(log n)
var searchRange = function(nums, target) {
const getLeftBorder = (nums, target) => {
let left = 0, right = nums.length - 1;
let leftBorder = -2;
while (left <= right) {
let mid = left + Math.floor((right - left) / 2);
if (nums[mid] >= target) {
right = mid - 1;
leftBorder = right;
} else {
left = mid + 1;
}
}
return leftBorder;
}
const getRightBorder = (nums,target) => {
let left = 0, right = nums.length - 1;
let RightBorder = -2;
while (left <= right) {
let mid = left + Math.floor((right - left) / 2);
if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
RightBorder = left;
}
}
return RightBorder;
}
let leftBorder = getLeftBorder(nums, target);
let RightBorder = getRightBorder(nums, target);
if (leftBorder === -2 || RightBorder === -2) return [-1, -1];
if (leftBorder < RightBorder - 1) return [leftBorder + 1, RightBorder - 1];
return [-1, -1];
}