前言
来自 英雄哪里出来 的一个 免费 集训,每天
5
5
5 点打卡学习算法(我是为了卷吗,主要是想早起 😏),希望能坚持下去。这里用来复盘每天都的打卡题目。
今日份知识点:数组
一、题目
题目 | 难度 |
---|---|
1588. 所有奇数长度子数组的和 | ⭐️ |
1848. 到目标元素的最小距离 | ⭐️ |
1652. 拆炸弹 | ⭐️ |
1640. 能否连接形成数组 | ⭐️ |
二、算法思路
1、所有奇数长度子数组的和
(1)起点—终点。遍历起点,在遍历终点,如果子子数组长度为
奇
数
奇数
奇数 那么把
和
和
和 加到结果中。
class Solution {
public:
int sumOddLengthSubarrays(vector<int>& arr) {
int ret = 0;
for (int i = 0; i < arr.size(); i ++)
{
int ans = 0;
for (int j = i; j < arr.size(); j ++)
{
ans += arr[j];
if ((j - i + 1) & 1)
ret += ans;
}
}
return ret;
}
};
2、到目标元素的最小距离
(1)从头到尾枚举,如果与 target
相等,更新一下答案。
class Solution {
public:
int getMinDistance(vector<int>& nums, int target, int start) {
int ret = 1010;
for (int i = 0; i < nums.size(); i ++)
{
if (nums[i] == target && abs(i - start) < ret)
ret = abs(i - start);
}
return ret;
}
};
3、拆炸弹
(1)枚举数组,根据
k
k
k,依次更新答案即可
class Solution {
public:
vector<int> decrypt(vector<int>& code, int k) {
int n = code.size();
vector<int> ret(n);
for (int i = 0; i < code.size(); i ++)
{
int ans = 0;
if (k > 0)
{
for (int j = i + 1; j <= i + k; ++ j)
{
ans += code[(j + n) % n];
}
ret[i] = ans;
}
else if (k < 0)
{
for (int j = (i - 1) % n; j >= (i + k) % n; -- j)
{
ans += code[(j + n) % n];
}
ret[i] = ans;
}
else
ret[i] = 0;
}
return ret;
}
};
4、能否连接形成数组
(1)枚举
a
r
r
arr
arr 数组的每一个元素
a
r
r
[
i
]
arr[i]
arr[i];
(2)然后枚举
p
i
e
c
e
s
pieces
pieces 数组中每个数组的头个元素
p
i
e
c
e
s
[
j
]
[
0
]
pieces[j][0]
pieces[j][0], 如果超出边界,返回 false
;
(3)如果等于
p
i
e
c
e
s
[
j
]
[
0
]
pieces[j][0]
pieces[j][0] 等于
a
r
r
[
i
]
arr[i]
arr[i] ,那么枚举数组
p
i
e
c
e
s
[
j
]
pieces[j]
pieces[j] 里的每一个元素
p
i
e
c
e
s
[
j
]
[
k
]
pieces[j][k]
pieces[j][k],如果元素相等,那么 i++, k++
,如果不相等,返回 false
;
(4)如果
a
r
r
arr
arr 数组全部都枚举完,那么返回 true
;
class Solution {
public:
bool canFormArray(vector<int>& arr, vector<vector<int>>& pieces) {
for (int i = 0; i < arr.size();)
{
bool falg = false;
int j = -1;
do j ++; while (j < pieces.size() && pieces[j][0] != arr[i]);
if (j == pieces.size())
return false;
int k = 0;
while (k < pieces[j].size() && arr[i] == pieces[j][k])
i ++, k ++;
if (k != pieces[j].size())
return false;
}
return true;
}
};