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

101 阅读1分钟

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

题号:90
//递归回溯不停的选择,剪枝去掉重复解
var subsetsWithDup = function (nums) {
    //排序的目的让相同元素放在一起
    nums.sort((a, b) => {
        return a - b
    })
    let result = [[]],path = []
    let helper = (left, right) => {
        if (left > right) {
            return
        }
        //记录上一次遍历的元素,这次和上次一样就调过
        let preEle = null
        for (let i = left; i <= right; i++) {
            if (i == left) {
                preEle = nums[left]
            } else {
                if (preEle == nums[i]) {
                    continue
                } else {
                    preEle = nums[i]
                }
            }
            //开始处理当前节点
            path.push(nums[i])
            //保存一个结果
            result.push(path.slice())
            //进行下一层检索
            helper(i + 1, right)
            //恢复路径
            path.pop()
        }
    }
    helper(0,nums.length - 1)
    return result
};
题号:78
//回溯基本题
var subsets = function (nums) {
     
    let result = [[]],path = []
    let helper = (left) => {
        if (left >= nums.length) {
            return
        }
        for (let i = left; i < nums.length; i++) {

            path.push(nums[i])
            result.push(path.slice())
            helper(i + 1)
            path.pop()
        }
    }
    helper(0)
    return result
};
题号:274
var hIndex = function (citations) {
    citations.sort((a,b) => {
        return a - b
    })
    let len = citations.length, result = 0
    //此题一开始有误解,我以为只有一个符合条件的h
    //实际是可能有多个取最小的
    for (let i = len - 1; i >= 0; i--) {
        if (citations[i] >=(len - 1 - i + 1)) {
            result = (len - 1 - i + 1)
        }
    }
    return result
};