如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的
题号:54
//回朔递归
var spiralOrder = function (matrix) {
let result = []
let direction = "右"
//校验该节点是否可以访问
let isValid = (i, j) => {
if (i < 0 || i >= matrix.length) {
//i越界
return false
}
if (j < 0 || j >= matrix[0].length) {
//j越界
return false
}
if (matrix[i][j] == 101) {
//访问过
return false
}
return true
}
//改变方向
let changeDirection = () => {
if (direction == "右") {
direction = "下"
} else if (direction == "下") {
direction = "左"
} else if (direction == "左") {
direction = "上"
} else if (direction == "上") {
direction = "右"
}
}
let gogo = (i, j) => {
//记录结果
result.push(matrix[i][j])
//标记已经访问过
matrix[i][j] = 101
//进行下一步访问
//while循环找到一个能访问执行的方向
let count = 4
while (count != 0) {
if (direction == "右") {
if (isValid(i, j + 1)) {
gogo(i, j + 1)
break
} else {
changeDirection()
}
} else if (direction == "下") {
if (isValid(i + 1, j)) {
gogo(i + 1, j)
break
} else {
changeDirection()
}
} else if (direction == "左") {
if (isValid(i, j - 1)) {
gogo(i, j - 1)
break
} else {
changeDirection()
}
} else if (direction == "上") {
if (isValid(i - 1, j)) {
gogo(i - 1, j)
break
} else {
changeDirection()
}
}
count--
}
}
gogo(0, 0)
return result
};
题号:59
var generateMatrix = function (n) {
let matrix = new Array(n)
for (let i = 0; i < n; i++) {
let arr = new Array(n).fill(0)
matrix[i] = arr
}
let curNum = 1
let direction = "右"
//校验该节点是否可以访问
let isValid = (i, j) => {
if (i < 0 || i >= matrix.length) {
//i越界
return false
}
if (j < 0 || j >= matrix[0].length) {
//j越界
return false
}
if (matrix[i][j] != 0) {
//访问过
return false
}
return true
}
//改变方向
let changeDirection = () => {
if (direction == "右") {
direction = "下"
} else if (direction == "下") {
direction = "左"
} else if (direction == "左") {
direction = "上"
} else if (direction == "上") {
direction = "右"
}
}
let gogo = (i, j) => {
//大的方向和54题一样,只不过54要遍历输出值
//此题是按既定方向填写值,就要保存当前已经
//填的最大值
matrix[i][j] = curNum
curNum++
//进行下一步访问
//while循环找到一个能访问执行的方向
let count = 4
while (count != 0) {
if (direction == "右") {
if (isValid(i, j + 1)) {
gogo(i, j + 1)
break
} else {
changeDirection()
}
} else if (direction == "下") {
if (isValid(i + 1, j)) {
gogo(i + 1, j)
break
} else {
changeDirection()
}
} else if (direction == "左") {
if (isValid(i, j - 1)) {
gogo(i, j - 1)
break
} else {
changeDirection()
}
} else if (direction == "上") {
if (isValid(i - 1, j)) {
gogo(i - 1, j)
break
} else {
changeDirection()
}
}
count--
}
}
gogo(0, 0)
return matrix
};
题号:16
//双指针优化部分复杂性
var threeSumClosest = function (nums, target) {
nums.sort((a, b) => {
return a - b
})
let sum = 0, left = 0, min = Number.MAX_SAFE_INTEGER, result = 0
for (let i = 0; i < nums.length - 2; i++) {
let left = i + 1, right = nums.length - 1
while (left < right) {
let sum = nums[i] + nums[left] + nums[right]
if (min > Math.abs(sum - target)) {
//发现更小的绝对差
min = Math.abs(sum - target)
result = sum
}
if (sum > target) {
right--
} else if (sum < target) {
left++
} else {
//相差为0最接近就是你了后面不遍历了
return target
}
}
}
return result
};
//多重循环+剪枝
var threeSumClosest = function (nums, target) {
nums.sort((a, b) => {
return a - b
})
let min = Number.MAX_SAFE_INTEGER, result = 0
for (let i = 0; i < nums.length - 2; i++) {
for (let j = i + 1; j < nums.length - 1; j++) {
let sum = nums[i] + nums[j] + nums[j + 1]
if (min > Math.abs(sum - target)) {
min = Math.abs(sum - target)
result = sum
}
//剪枝
if (sum > target) {
break
} else if (sum == target) {
return target
}
for (let k = j + 1; k < nums.length; k++) {
let sum = nums[i] + nums[j] + nums[k]
if (min > Math.abs(sum - target)) {
min = Math.abs(sum - target)
result = sum
}
//剪枝
if (sum > target) {
break
} else if (sum == target) {
return target
}
}
}
}
return result
};