【Leetcode】第八日--前缀和

一、题目列表

1480. 一维数组的动态和
1588. 所有奇数长度子数组的和
1442. 形成两个异或相等数组的三元组数目
1094. 拼车

二、解题思路

1.一维数组的动态和

题目描述:

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

​ 请返回 nums 的动态和。

class Solution {
    public int[] runningSum(int[] nums) {
        int sum = 0;
        for(int i = 1; i < nums.length; i++){
            nums[i] += nums[i-1];
        }

        return nums;
    }
}

2.所有奇数长度子数组的和

题目描述:

​ 给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。

​ 子数组 定义为原数组中的一个连续子序列。

​ 请你返回 arr 中 所有奇数长度子数组的和 。

class Solution {
    public int sumOddLengthSubarrays(int[] arr) {
        int res = 0;
        int len = arr.length;
        int[] sum = new int[len];
        for(int i = 0; i < len; i++){
            sum[i] = arr[i];
            if(i != 0){
                sum[i]+=sum[i-1];
            }
        }

        for(int i = 1; i <= len; i+=2){//奇数长度
            for(int j = 0; j+i-1 < len; j++){
                res += sum[j+i-1] - (j-1 < 0 ? 0 :sum[j-1]);
            }

        }

        return res;
    }
}

3.形成两个异或相等数组的三元组数目

题目描述:

​ 给你一个整数数组 arr 。

​ 现需要从数组中取三个下标 i、j 和 k ,其中 (0 <= i < j <= k < arr.length) 。

​ a 和 b 定义如下:

​ a = arr[i] ^ arr[i + 1] ^ … ^ arr[j - 1]
​ b = arr[j] ^ arr[j + 1] ^ … ^ arr[k]
​ 注意:^ 表示 按位异或 操作。

​ 请返回能够令 a == b 成立的三元组 (i, j , k) 的数目。

class Solution {
    public int countTriplets(int[] arr) {
        int res = 0;
        int len = arr.length;
        int[] sum = new int[len];
        for(int i = 0; i < len; i++){ //异或前缀和
            sum[i] = arr[i];
            if(i != 0){
                sum[i] ^= sum[i-1]; 
            }
        }

        for(int i = 0; i < len; i++){
            for(int j = i+1; j < len; j++){
                for(int k = j; k < len; k++){
                    int a = sum[j-1] ^ (i-1 < 0 ? 0 : sum[i-1]);
                    int b = sum[k] ^ sum[j-1];
                    if(a == b) res++;
                }
            }
        }
        return res;
    }
}

4.拼车

题目描述:

车上最初有 capacity 个空座位。车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向)

给定整数 capacity 和一个数组 trips , trip[i] = [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客,接他们和放他们的位置分别是 fromi 和 toi 。这些位置是从汽车的初始位置向东的公里数。

当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false。

class Solution {
    public boolean carPooling(int[][] trips, int capacity) {
        int[] nums = new int[1002];
        for(int i = 0; i < trips.length; i++){
            int cnt = trips[i][0];//每站的人数
            int l = trips[i][1];//上站位置
            int r = trips[i][2];//下站位置
            nums[l] += cnt;
            nums[r] -= cnt;
        }

        int sum = 0;
        for(int i = 0; i < 1001; i++){
            sum+= nums[i];
            if(sum > capacity){
                return false;
            }
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值