第196场周赛-记录第一次参加周赛
准备刷题的时候刚好看到有一场周赛,就试了试,果然还是太菜了
四道题,一个半小时
第一题
5452. 判断能否形成等差数列
给你一个数字数组 arr 。
如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。
如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false 。
示例 1:
输入:arr = [3,5,1]
输出:true
解释:对数组重新排序得到 [1,3,5] 或者 [5,3,1] ,任意相邻两项的差分别为 2 或 -2 ,可以形成等差数列。
示例 2:
输入:arr = [1,2,4]
输出:false
解释:无法通过重新排序得到等差数列。
提示:
2 <= arr.length <= 1000
-10^6 <= arr[i] <= 10^6
简单题,思路就是排序后判断相邻数差是否相同,相同返回true,否则停止遍历返回false
class Solution {
public:
bool canMakeArithmeticProgression(vector<int>& arr) {
sort(arr.begin(),arr.end());
int n, i=0, j;
j = arr[i] - arr[i+1];
n = arr.size();
for(i;i<n-1;i++)
{
if((arr[i]-arr[i+1])==j)
continue;
else return false;
}
return true;
}
};
一次通过,耗时5min。 (代码能力还是太差,看大佬这题用了1min)
下一题
1503. 所有蚂蚁掉下来前的最后一刻
有一块木板,长度为 n 个 单位 。一些蚂蚁在木板上移动,每只蚂蚁都以 每秒一个单位 的速度移动。其中,一部分蚂蚁向 左 移动,其他蚂蚁向 右 移动。
当两只向 不同 方向移动的蚂蚁在某个点相遇时,它们会同时改变移动方向并继续移动。假设更改方向不会花费任何额外时间。
而当蚂蚁在某一时刻 t 到达木板的一端时,它立即从木板上掉下来。
给你一个整数 n 和两个整数数组 left 以及 right 。两个数组分别标识向左或者向右移动的蚂蚁在 t = 0 时的位置。请你返回最后一只蚂蚁从木板上掉下来的时刻。
提示:
1 <= n <= 10^4
0 <= left.length <= n + 1
0 <= left[i] <= n
0 <= right.length <= n + 1
0 <= right[i] <= n
1 <= left.length + right.length <= n + 1
left 和 right 中的所有值都是唯一的,并且每个值 只能出现在二者之一 中。
这题看了好一会,最后发现可以不用管掉头,因为两个相遇的蚂蚁都掉头之后就相当于都没掉头继续前行。所以题目长,其实就是找左数组里的最小值和右数组的最大值,然后用长度减最小值与最大值比较,得到的最大值就是结果。
因为题目用的vector数组,所以要自己找最小值最大值。
class Solution {
public:
int getLastMoment(int n, vector<int>& left, vector<int>& right) {
int i, m, temp, anws, r_min = INT_MAX, l_max = 0;
m = right.size();
for (i=0;i<m;i++)
if(right[i]<r_min)
r_min = right[i];
m = left.size();
for (i=0;i<m;i++)
if(left[i]>l_max)
l_max = left[i];
return max((l_max),(n-r_min));
}
};
用时20min。(大佬2min就做完了)
之后看了一眼第三题,跳过了,花了很久做最后一题,直到最后也没做出来,但是结束了之后就做出来了。。
5455. 最多 K 次交换相邻数位后得到的最小整数
给你一个字符串 num 和一个整数 k 。其中,num 表示一个很大的整数,字符串中的每个字符依次对应整数上的各个 数位 。
你可以交换这个整数相邻数位的数字 最多 k 次。
请你返回你能得到的最小整数,并以字符串形式返回。
示例 1:
输入:num = “4321”, k = 4
输出:“1342”
解释:4321 通过 4 次交换相邻数位得到最小整数的步骤如上图所示。
思路简单,判断k能否完全遍历数组,能的话找最小值,不能的话找k个值的最小值,然后k减掉移动的长度。
比赛的时候超时,做不出来,想不到怎么优化,出来之后发现加上如果字符串长度的平方比k小的话就可以把字符串完全排序,加上这一句就能双100了
class Solution {
public:
string minInteger(string num, int k) {
int i, j, n, m=0, min=INT_MAX;
string temp;
n = num.length();
if (num.size() * num.size() < k) {
sort(num.begin(), num.end());
return num;
}
while(k>0&&m<n)
{
if(m+k>=n){
for(i=m;i<n;i++)
{
if(num[i]<min)
{
min = num[i];
j = i;
}
}
temp = num[j];
num.erase(j, 1);
num.insert(m, temp);
k = k - j + m;
min = INT_MAX;
m++;
}
else if(m+k<n){
for(i=m;i<(m+k+1);i++)
{
if(num[i]<min)
{
min = num[i];
j = i;
}
}
temp = num[j];
num.erase(j,1);
num.insert(m,temp);
k = k - j + m;
min = INT_MAX;
m++;
}
}
return num;
}
};
第三题目前还没做,做了在补。
感想
太菜,好在进步空间挺大,继续刷题总结进步吧。。