写在前面
周末leetcode比赛做题整理。
周赛 181
1389. 按既定顺序创建目标数组
给你两个整数数组 nums 和 index。你需要按照以下规则创建目标数组:
目标数组 target 最初为空。
按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。
重复上一步,直到在 nums 和 index 中都没有要读取的元素。
请你返回目标数组。
题目保证数字插入位置总是存在。
提示:
- 1 <= nums.length, index.length <= 100
- nums.length == index.length
- 0 <= nums[i] <= 100
- 0 <= index[i] <= i
解法:范围这么小,模拟一遍就行,一边插入一边移动。
代码:
class Solution {
public:
vector<int> createTargetArray(vector<int>& a, vector<int>& b) {
if(a.empty() || b.empty()) return {};
vector<int> res(b.size(),-1);
for(int i=0; i<b.size(); i++){
if(res[b[i]]==-1){
res[b[i]] = a[i];
}
else{
for(int j=b.size()-1; j>=b[i]+1; j--)
res[j] = res[j-1];
res[b[i]] = a[i];
}
}
return res;
}
};
1390. 四因数
给你一个整数数组 nums,请你返回该数组中恰有四个因数的这些整数的各因数之和。
如果数组中不存在满足题意的整数,则返回 0 。
示例:
输入:nums = [21,4,7]
输出:32
解释:
21 有 4 个因数:1, 3, 7, 21
4 有 3 个因数:1, 2, 4
7 有 2 个因数:1, 7
答案仅为 21 的所有因数的和。
提示:
- 1<= nums.length <= 10^4
- 1 <= nums[i] <= 10^5
解法:判断因数的复杂度是O(sqrt(n)),再乘上数组长度,不会超时,所以挨个判断就行了。
代码:
class Solution {
public:
bool checkNum(int k){
int s = 2;
for(int i=2; i<=sqrt(k); i++)
if(k%i==0){
if(i!=k/i) s+=2;
else s++;
}
//cout<<s<<endl;
if(s==4) return true;
return false;
}
int sumFourDivisors(vector<int>& nums) {
int res = 0;
if(nums.empty()) return res;
for(auto x : nums){
//cout<<x<<endl;
if(checkNum(x)){
res += 1 + x;
for(int j=2; j<=x; j++)
if(x%j==0){
res += j + x/j;
break;
}
}
}
return res;
}
};
1391. 检查网格中是否存在有效路径
给你一个 m x n 的网格 grid。网格里的每个单元都代表一条街道。grid[i][j] 的街道可以是:
1 表示连接左单元格和右单元格的街道。
2 表示连接上单元格和下单元格的街道。
3 表示连接左单元格和下单元格的街道。
4 表示连接右单元格和下单元格的街道。
5 表示连接左单元格和上单元格的街道。
6 表示连接右单元格和上单元格的街道。
你最开始从左上角的单元格 (0,0) 开始出发,网格中的「有效路径」是指从左上方的单元格 (0,0) 开始、一直到右下方的 (m-1,n-1) 结束的路径。该路径必须只沿着街道走。
注意:你 不能 变更街道。
如果网格中存在有效的路径,则返回 true,否则返回 false 。
示例: 输入:grid = [[2,4,3],[6,5,2]] 输出:true 解释:如图所示,你可以从 (0, 0) 开始,访问网格中的所有单元格并到达 (m - 1, n - 1) 。