300. 最长递增子序列
var lengthOfLIS = function(nums) {
if(!nums.length) return 0
const tails = []
for(let num of nums) {
let left = 0
let right = tails.length - 1
while(left <=right) {
let mid = Math.floor((left+right) / 2)
if(tails[mid]<num) {
left = mid + 1
} else {
right = mid-1
}
}
tails[left] = num
}
return tails.length
};
287. 寻找重复数
var findDuplicate = function(nums) {
let slow = nums[0]
let fast = nums[0]
do {
slow = nums[slow]
fast = nums[nums[fast]]
} while(fast != slow)
slow = nums[0]
while(fast !== slow) {
slow = nums[slow]
fast = nums[fast]
}
return fast
};
var findDuplicate = function(nums) {
let low = 1
let high = nums.length -1
while(low < high) {
let mid = Math.floor((low+high) / 2)
let count = 0
for(let num of nums) {
if(num<= mid) {
count++
}
}
if(count > mid) {
high = mid
} else {
low = mid+1
}
}
return low
};
240. 搜索二维矩阵 II
var searchMatrix = function(matrix, target) {
let row = 0
let col = matrix[0].length -1
while(row < matrix.length && col>=0) {
let num = matrix[row][col]
if(num === target) {
return true
} else if(num > target) {
col--
} else {
row++
}
}
return false
};
34. 在排序数组中查找元素的第一个和最后一个位置
var searchRange = function(nums, target) {
const lowerBound = (val) => {
let left = 0
let right = nums.length - 1
while(left <= right) {
let mid = Math.floor((left + right) / 2)
if(nums[mid] >= val) {
right = mid -1
} else {
left = mid+1
}
}
return left
}
let start = lowerBound(target)
if(start === nums.length || nums[start] !== target) {
return [-1,-1]
}
const end = lowerBound(target+1)-1
return [start, end]
};
33. 搜索旋转排序数组
var search = function(nums, target) {
let left = 0
let right = nums.length - 1
while(left<=right) {
let mid = Math.floor((left+right) / 2)
if(nums[mid] === target) {
return mid
}
if(nums[left] <= nums[mid]) {
if(target<nums[mid] && target >= nums[left]) {
right = mid - 1
} else {
left = mid + 1
}
} else {
if(target>nums[mid] && target <= nums[right]) {
left = mid+1
} else {
right = mid -1
}
}
}
return -1
};
相关笔记