一、题目列表
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;
}
}