前言:
五月集训,前面为学习内容,想要一起学习的可以看一看,最后的才是五月集训每天的作业。
一、知识点
日后再说🤭
二、课堂习题
这里的题均出自《算法零基础100讲》
着急学习的同学去看专栏吧。
三、作业
1480. 一维数组的动态和
1588. 所有奇数长度子数组的和
1442. 形成两个异或相等数组的三元组数目
1094. 拼车
解题思路:
1.模板题,定义一个前缀和数组,逐渐累加即可;
2.先定义填充前缀和数组,答案的求解需要一个外循环来规定数列长度,右指针元素-左指针元素即为这段数列的和,内循环累加答案;
3.跟上一题思路一样,只需要将求和的过程换成亦或的过程,然后加一步判断是否相等即可;
4.这里前缀和数组中,需要统计的是车上的乘客数,所有将所有乘客上车下车的人数按顺序放入前缀和数组中,然后扫描每一站,判断是否超载。
代码以及结果:
class Solution {
public int[] runningSum(int[] nums) {
for(int i = 1;i < nums.length;++i){
nums[i] += nums[i-1];
}
return nums;
}
}
class Solution {
public int sumOddLengthSubarrays(int[] arr) {
int n = arr.length;
int[] sum = new int[n+1];
for(int i = 1;i <= n;++i){
sum[i] = sum[i-1] + arr[i-1];
}
int res = 0;
for(int len = 1;len <= n;len += 2){
for(int l = 0;l + len - 1 < n;++l){
int r = l + len - 1;
res += sum[r+1] - sum[l];
}
}
return res;
}
}
class Solution {
public int countTriplets(int[] arr) {
int n = arr.length;
int[] sum = new int[n + 1];
for (int i = 1; i <= n; i++)
sum[i] = sum[i - 1] ^ arr[i - 1];
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
for (int k = j; k <= n; k++) {
int a = sum[j - 1] ^ sum[i - 1];
int b = sum[k] ^ sum[j - 1];
if (a == b) ans++;
}
}
}
return ans;
}
}
class Solution {
public boolean carPooling(int[][] trips, int capacity) {
int n = trips.length;
int[] cnt = new int[1010];
for(int i = 0;i < n;i++){
int nums = trips[i][0];
int up = trips[i][1];
int down = trips[i][2];
cnt[up] += nums;
cnt[down] -= nums;
}
int sum = 0;
for(int i = 0;i < 1000;i++){
sum += cnt[i];
if(sum > capacity)
return false;
}
return true;
}
}
四、总结
对于算法的掌握还是不够熟练,需要进行反复训练!
另外,剩下的课堂训练题目留到下个月的集训啦(●ˇ∀ˇ●)