前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是六月集训第一天:数组🔥
一、练习题目
二、算法思路
- 1、1588. 所有奇数长度子数组的和:这题之前用前缀和做过一次,这次用两次遍历,定一个起始点i,一个从i开始移动的j,当
j-i + 1
等于奇数我们把这一串数的和累加入最终的答案中。 - 2、1848. 到目标元素的最小距离:😄水题。
- 3、1652. 拆炸弹:按照题目意思模拟即可,那个取模的话可以先看些数论的知识知道为什么可以这么做。
- 4、1640. 能否连接形成数组:模拟的话这道题要把逻辑理清楚,需要花了点时间。
三、源码剖析
// 1588. 所有奇数长度子数组的和
class Solution {
public:
int sumOddLengthSubarrays(vector<int>& arr) {
int n = arr.size();
int ans = 0;
for(int i = 0; i < n; ++i) {
int sum = 0;
for(int j = i; j < n; ++j) {
sum += arr[j]; //(1)
if((j - i + 1) & 1) { /(2)
ans += sum;
}
}
}
return ans;
}
};
- 1、记录一下
i -> j
区间的前缀和; - 2、如果发现子数组的长度是奇数的话累加到结果中。
// 1848. 到目标元素的最小距离
class Solution {
public:
int getMinDistance(vector<int>& nums, int target, int start) {
int n = nums.size();
int min_ = INT_MAX; //(1)
for(int i = 0; i < n; ++i) {
if(nums[i] == target) {
min_ = min(min_, abs(start - i)); //(2)
}
}
return min_;
}
};
- 1、定义一个最小值;
- 2、记录目标元素的最小值。
// 1652. 拆炸弹
class Solution {
public:
vector<int> decrypt(vector<int>& code, int k) {
vector<int> ret;
int n = code.size(), val;
for(int i = 0; i < n; ++i) {
val = 0;
if(k > 0) {
for(int j = i + 1; j <= i + k; ++j) {
val += code[j % n];
} //(1)
} else if (k < 0) {
val = 0;
for(int j = i - 1; j >= i + k; --j) {
val += code[(j % n + n) % n];
} //(2)
}
ret.emplace_back(val);
}
return ret;
}
};
- 1、模拟
k > 0
的情况,要构成一个循环数组,取模防止数组下标越界; - 2、模拟
k < 0
,要构成一个循环数组,val += code[(j % n + n) % n]
取模防止数组下标越界。 - 3、最后是
k = 0
情况。
// 1640. 能否连接形成数组
class Solution {
public:
bool canFormArray(vector<int>& arr, vector<vector<int>>& pieces) {
int n = arr.size();
bool flag = false;
for(int i = 0; i < n; ) {
flag = false;
for(int j = 0; j < pieces.size(); j++) {
if(arr[i] != pieces[j][0]) { //(1)
continue ;
}
for(int k = 0; k < pieces[j].size(); k++) {
if(arr[i] == pieces[j][k]) { //(2)
i++;
flag = true;
} else {
return false;
}
}
if(i == n) { //(3)
return true;
}
}
if(!flag) {
return false;
} //(4)
}
return true;
}
};
- 1、一维数组中的第一个数就和arr数组中的对不上了直接就false;
- 2、这里再定义一个指针,如果一维数组第一个数相同,接下去找后面的数是不是也相同;
- 3、
i = n
了说明arr中的数已经扫完可以连接成功。 - 4、遍历完一轮都没有相同的,返回false。