16.最接近的三数之和
力扣16
思路:双指针
存三数之和与target的差的绝对值的最小值min|sum - target|
以及这个和sum
- 先排序
nums.sort((a, b)=>a - b)
- 固定第一个数
i
并遍历这个数(0:lenth-2) - 双指针分别指向
i+1
和lenth-1
,根据和sum
与target
的相对大小移动指针,相等时直接返回
绝对值
Math.abs()
无穷大值Infinity
数组求和的计算方法arr.reduce((prev,current,index,arr)=>{},initValue)
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var threeSumClosest = function(nums, target) {
var n = nums.length
if(n===3) return getSum(nums)
nums.sort((a,b)=>a-b)
var minNum = Infinity
var res
for(let i=0;i<n-2;i++){
let left = i+1
let right = n - 1
while(left<right){
let sum = nums[i]+nums[left]+nums[right]
let diff = Math.abs(sum - target)
if(diff < minNum){
minNum = diff
res = sum
}
if(sum === target){
return target
} else if(sum <target){
left += 1
} else{
right -= 1
}
}
}
return res
};
function getSum(arr){
return arr.reduce((total,current)=>total+current,0)
}
524. 通过删除字母匹配到字典里最长单词
力扣524
思路:指针
讲字符串数组先排序(长度降序,字典序升序)
然后挨个匹配,匹配到的第一个就是所求,如果没有匹配到,则返回空串。
Array中的fill方法
Array(n).fill(‘a’)
Array(n)
:定义一个数组,里面有n个元素。
fill()
方法将一个数组的所有元素从开始索引填充到具有静态值的结束索引arr.fill(value, start, end)
字符串里面超出index取到的值是undefined
两个字符串可以比较大小,但是不能相减
dictionary.sort((a,b)=>b.length-a.length||(a>b?1:-1))
arr.sort()
中函数中 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前
/**
* @param {string} s
* @param {string[]} dictionary
* @return {string}
*/
var findLongestWord = function(s, dictionary) {
var res = ''
dictionary.sort((a,b)=>b.length-a.length||(a>b?1:-1))
for (let i = 0;i<dictionary.length;i++){
let flag = match(dictionary[i],s)
if(flag>0){
return dictionary[i]
}
}
return res
};
function match(dict, s){
let j = 0
for(let i=0;i<s.length;i++){
if(s[i]==dict[j]){
j++
}
if(j == dict.length){
return true
}
}
return false
}
75.搜索二维矩阵
力扣7
思路:
- 先找出第一列的数里面
target
的下界值,从而锁定目标值可能的所在行 - 在该行继续寻找
注意在有序的数字列表中搜索一个值,采用二分查找降低复杂度
Math.floor()
向下整除
力扣240
思路:
从右上角num
开始遍历
- 小于该值向左移动,成为新的右上角
- 大于该值向下移动,成为新的右上角
重点在于:对于右上角的值,下面的值都大于它,左边的值都小于它
复杂度(m+n)
var searchMatrix = function(matrix, target) {
var m = matrix.length
var n = matrix[0].length
var ms = 0
var ns = n - 1
while(ms < m & ns >= 0){
if(matrix[ms][ns] === target){
return true
}else if(matrix[ms][ns] > target){
ns -= 1
}else{
ms += 1
}
}
return false
};