leetcode Day9 前缀和

90 阅读1分钟

821. 字符的最短距离

var shortestToChar = function(s, c) {
    let res=new Array(s.length).fill(0)
    let idx=-s.length
    for(let i=0;i<s.length;i++){
        if(s[i]===c){
            idx=i
        }
        res[i]=i-idx
    }
    idx=s.length*2
    for(let i=s.length-1;i>=0;i--){
        if(s[i]===c){
            idx=i
        }
        res[i]=(idx-i)>res[i]?res[i]:(idx-i)
    }
    return res
};

剑指 Offer II 010. 和为 k 的子数组

var subarraySum = function(nums, k) {
    let mp=new Map()
    mp.set(0,1)
    let pre=0,count=0
    for(let i of nums){
        pre=pre+i
        if(mp.has(pre-k)){
            count=count+mp.get(pre-k)
        }
        if(mp.has(pre)){
            mp.set(pre,mp.get(pre)+1)
        }else{
            mp.set(pre,1)
        }
    }
    return count
};

剑指 Offer II 012. 左右两边子数组的和相等

var pivotIndex = function(nums) {
    let i=0
    while(i<nums.length){
        let lsum=0,rsum=0
        for(let l=0;l<i;l++){
            lsum+=nums[l]
        }
        for(let r=i+1;r<nums.length;r++){
            rsum+=nums[r]
        }
        if(lsum===rsum){
            return i
        }else{
            i++
        }
    }
    return -1
};
var pivotIndex = function(nums) {
    const total=nums.reduce((a,b)=>a+b,0)
    let sum=0
    for(let i=0;i<nums.length;i++){
        if(sum*2+nums[i]===total){
            return i
        }
        sum=sum+nums[i]
    }
    return -1
};

剑指 Offer II 011. 0 和 1 个数相同的子数组

var findMaxLength = function(nums) {
    let mp=new Map()
    let pre=0,res=0
    mp.set(0,-1)
    for(let i=0;i<nums.length;i++){
        pre=pre+(nums[i]===0?-1:1)
        if(mp.has(pre)){
            res=Math.max(res,i-mp.get(pre))
        }
        else{
            mp.set(pre,i)
        }
    }
    return res
};