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

66 阅读1分钟

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

题号:75
//map统计各个数字出现频率,然后在原数组上从新赋值
var sortColors = function (nums) {
    let map = new Map()
    nums.forEach((item) => {
        if (map.has(item)) {
            let num = map.get(item)
            num++
            map.set(item,num)
        } else { 
            map.set(item,1)
        }
    });
    let begin = 0
    if (map.has(0)) {
        let num0 = map.get(0)
        nums.fill(0, begin, begin + num0)
        begin = begin + num0 
    }
    if (map.has(1)) {
        let num1 = map.get(1)
        nums.fill(1, begin, begin + num1)
        begin = begin + num1 
    }
    if (map.has(2)) {
        let num2 = map.get(2)
        nums.fill(2, begin, begin + num2)
        begin = begin + num2 
    }
    return nums
};
//多次扫描
var sortColors = function (nums) {
    
    let begin = 0
    for (let i = begin; i < nums.length; i++) {
        if (nums[i] == 0) {
            //交换
            let tmp = nums[begin]
            nums[begin] = nums[i]
            nums[i] = tmp
            begin ++
        }
    }
    for (let i = begin; i < nums.length; i++) {
        if (nums[i] == 1) {
            //交换
            let tmp = nums[begin]
            nums[begin] = nums[i]
            nums[i] = tmp
            begin ++
        }
    }
    return nums
};
//实现快排
var sortColors = function (nums) {
    
    qSort(nums,0,nums.length - 1)
    return nums
};
function qSort(nums, left, right) {
    //保存初始要排序的数组端的边界
    let i = left
    let j = right
    if (i > j) {
        return
    }
    let pivot = nums[i]//选择基准点
    while (left < right) {
        //从右边找小于基准点的值
        while (nums[right] >= pivot && left < right) {
            right --
        }
        while (nums[left] <= pivot && left < right) {
            left ++
        }
        if (left < right) {
            //交换
            let tmp = nums[right]
            nums[right] = nums[left]
            nums[left] = tmp
        }
    }
    //把基准值放到我们寻找的位置
    nums[i] = nums[left]
    nums[left] = pivot
    qSort(nums, i, left - 1)
    qSort(nums,left + 1,j)
}
题号:98
//中序遍历
//一开始是中序遍历这个树把结果放入数组,再遍历数组是否递增
//浪费空间
//下面中序遍历的顺序继续前一个值,遍历的过程就把排序的正确
//与否给计算出来了
var isValidBST = function (root) {
    let preVal = Number.MIN_SAFE_INTEGER
    let helper = (node) => { 
        if (node == null) {
            return true
        }
        if (!helper(node.left)) {
            return false
        }
        if (node.val <= preVal) {
            return false
        }
        preVal = node.val
        return helper(node.right)
    }
    return helper(root)
}
题号:152
//动态规划多表
var maxProduct = function (nums) {
    let minTable = new Array(nums.length)
    let maxTable = new Array(nums.length)

    for (let i = 0; i < nums.length; i++) {
        if (i == 0) {
            minTable[i] = nums[i]
            maxTable[i] = nums[i]
        } else { 
            minTable[i] = Math.min(nums[i], minTable[i-1] * nums[i], maxTable[i-1] * nums[i])
            maxTable[i] = Math.max(nums[i],minTable[i-1]*nums[i],maxTable[i-1]*nums[i])
        }
    }
    let result = Number.MIN_SAFE_INTEGER
    maxTable.forEach((item) => {
        result = Math.max(result,item)
    });
    return result
};