日常刷题0x11之未出新手村

88 阅读2分钟

如果不小心网友来到了这里请网友自动飘走,浪费你们时间表示歉意。该系列博客的目的是:想作为自律工具和朋友一起每天刷几道题作为打卡督促的功能,没有什么可参考学习的东西,也不是刷博客量充大佬的目的

题号: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
};