LeetCode 75 突破:一维数组的动态 & 寻找数组的中心下标

54 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

LeetCode 75 学习计划适用于想为技术面试做准备但不确定应该聚焦于哪些题目的用户。学习计划中的题目都是经过精心挑选的,Level 1和 Level 2 学习计划是为初级用户和中级用户准备的,题目覆盖了大多数中层公司面试时所必需的数据结构和算法,Level 3 学习计划则是为准备面试顶级公司的用户准备的。来源

第 1 天

一维数组的动态和

难度:简单

题目

给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。请返回 nums 的动态和。

示例 1:
输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。

示例 2:
输入:nums = [1,1,1,1,1]
输出:[1,2,3,4,5]
解释:动态和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] 。

示例 3:
输入:nums = [3,1,2,10,1]
输出:[3,4,6,16,17]

解答

这题简单,要是所有笔试都这么简单就好了。

数组遍历一次,从第 2 项开始,每一项等于前面所有项的和。

/**
 * @param {number[]} nums
 * @return {number[]}
 */
var runningSum = function(nums) {
    let res= [nums[0]]
    let count = nums[0]
    for(let i=1,len= nums.length;i<len;i++){
        res.push(count+nums[i])
        count = count+nums[i]
    }
    return res
};

image.png

不过看了看其他人的解法,更简洁啊:

var runningSum = function(nums) {
    let bigNum = 0
    return nums.map(item => bigNum += item)
};

作者:ityou-o

找数组的中心下标

难度: 简单

题目

给你一个整数数组 nums ,请计算数组的 中心下标 。

数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。

如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。

如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。

示例 1:
输入:nums = [1, 7, 3, 6, 5, 6]
输出:3
解释:
中心下标是 3 。
左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 ,
右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。

示例 2:
输入:nums = [1, 2, 3]
输出:-1
解释:
数组中不存在满足此条件的中心下标。

示例 3:
输入:nums = [2, 1, -1]
输出:0
解释:
中心下标是 0 。
左侧数之和 sum = 0 ,(下标 0 左侧不存在元素),
右侧数之和 sum = nums[1] + nums[2] = 1 + -1 = 0

解答

不看题解,最暴力的思路就是算每一项,左边的和与右边的和是否相等,然后再取下标。这样多少显得很笨。

看题解,抽象为一个公式:

sumTotal == 2* sumleft + nums[i]

即:总和等于 2 倍的左边的和,再加上中间的这个数。这样理解,就豁然开朗了。

左右相等,并不是一定要做减法,做加法,然后等于总和,也是可以的。

JS 实现:

var pivotIndex = function(nums) {
    //求n项和
    function sum(n){
        var sum = 0;
        for(var i = 0; i <= n; i++){
            sum += nums[i];
        }
        return sum;
    }
    var sumTotal= sum(nums.length-1);  //总和
    for(var i = 0 ; i < nums.length; i++){
        var sumleft = sum(i-1);
        if(sumTotal == 2* sumleft + nums[i]){  //中心索引公式
            return i;
        }
    }
    return -1;
};

总结

两个题算是比较简单,第二题还有点巧劲。

即使是简单题,也有巧思路,代码更美观。