leetcode刷题打卡-第三天

107 阅读2分钟

53. 最大子数组和

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。

var maxSubArray = function(nums) {
    let sum = 0;
    let maxRes=nums[0];
    for(let i=0;i<nums.length;i++){
        if(sum>0){
            sum+=nums[i]
        }else{
            sum=nums[i]
        }
        maxRes = Math.max(maxRes,sum)
    }
    return maxRes
};

58. 最后一个单词的长度

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。

var lengthOfLastWord = function(s) {
    const arr = s.trim().split(' ');
    console.log(arr)
    return arr.pop().length

};

66. 加一

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头

var plusOne = function (digits) {
    if (digits.findIndex(e => e !== 9) > -1) {
        // 不全是9
        let i = digits.length - 1
        while (digits[i] === 9) {
            digits[i] = 0;
            i--
        }
        digits[i] = digits[i] + 1
        return digits
    } else {
        for (let i = digits.length; i > 0; i--) {
            digits[i] = 0
        }
        digits[0] = 1
        return digits
    }

};

67. 二进制求和

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 1 和 0

var addBinary = function (a, b) {
    let res = [], tag = 0

    for (let i = a.length - 1, j = b.length - 1; i >= 0 || j >= 0; i--, j--) {

        let itemA = i >= 0 ? Number(a[i]) : 0, itemB = j >= 0 ? Number(b[j]) : 0;

        res.unshift((itemA + itemB + tag) % 2)
        tag = Math.floor((tag + itemA + itemB) / 2)

    }
    if (tag) {
        res.unshift(tag)
    }
    return res.join('')
};

69. x 的平方根

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。

注意: 不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

var mySqrt = function (x) {
    if (x === 0 || x === 1) {
        return x
    }

    let left = 0, right = x, mid = Math.floor(x / 2)

    while (left <= right) {
        mid = Math.floor((left + right) / 2)
        
        if (mid * mid <= x && (mid + 1) * (mid + 1) > x) {
            return mid
        }
        if (mid * mid < x) {
            left = mid + 1
        } else {
            right = mid - 1
        }

    }
};

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

var climbStairs = function (n) {
    const res = new Array(n + 1).fill(0);
    res[0] = 1;
    res[1] = 1;
    for (let i = 2; i <= n; i++) {
        res[i] = res[i - 2] + res[i - 1];
    }
    console.log(res)
    return res[n];

};

83. 删除排序链表中的重复元素

给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。

var deleteDuplicates = function (head) {
    let tag = head;
    while (tag && tag.next) {
        if (tag.val == tag.next.val) {
            tag.next = tag.next.next
        } else {
            tag = tag.next
        }

    }

    return head
};

88. 合并两个有序数组

给你两个按 非递减顺序 排列的整数数组 nums1 **和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

请你 合并 nums2 **到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

注意: 最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。

var merge = function (nums1, m, nums2, n) {
    for (let i = 0; i < n; i++) {
        nums1[m + i] = nums2[i]
    }

    for (let j = nums1.length; j > 0; j--) {
        for (let k = 0; k < j; k++) {
            if (nums1[k] > nums1[k + 1]) {
                [nums1[k], nums1[k + 1]] = [nums1[k + 1], nums1[k]]
            }
        }
    }
};

94. 二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

var inorderTraversal = function (root) {
    if (root === null) return [];
    const left = inorderTraversal(root.left);
    const right = inorderTraversal(root.right);
    // 中序
    return [...left, root.val, ...right];

    // 前序
    // return [root.val, ...left, ...right];

    // 后序
    // return [...left, ...right, root.val];

};

100. 相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

var isSameTree = function (p, q) {
    if (p == null && q == null) {
        return true;
    }
    if (p == null || q == null) {
        return false;
    }
    if (p.val != q.val) {
        return false;
    }

    return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
};