题目来源于知识星球—英雄算法联盟,六月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、1588.所有奇数长度子数组的和(简单)
1.题目描述
2.解题思路
奇数长度之间的间隔为2,从长度为1开始遍历,开始位置为下标0,结束位置
为开始下标+奇数长度-1,最后将元素累加即可。
3.代码演示(C++)
class Solution
{
public:
int sumOddLengthSubarrays(vector<int>& arr)
{
int sum=0;
int n=arr.size();
for(int start=0;start<n;start++)
{
for(int length=1;length+start<=n;length+=2)
{
int end=start+length-1;
for(int i=start;i<=end;i++)
{
sum+=arr[i];
}
}
}
return sum;
}
};
4.题目链接
二、1848.到目标元素的最小距离(简单)
1.题目描述
2.解题思路
根据题意一步步来即可,简单题
3.代码演示(C++)
class Solution
{
public:
int getMinDistance(vector<int>& nums, int target, int start)
{
int n=nums.size();
int min=999;
for(int i=0;i<n;i++)
{
if(nums[i]==target)
{
if(abs(i-start)<min)
{
min=abs(i-start);
}
}
}
return min;
}
};
4.题目链接
三、1652.拆炸弹(简单)
1.题目描述
2.解题思路
根据题意,我们会由K的值来对数组进行修改,K大于0时,将第i个数字
用接下来的K个数字之和替换;K小于0时,将第i个数字用之前K个数字
之和替换;K等于0时,将第i个数字用0替换。注意:数组是循环的,最
后一位元素的下一位为首元素!!!
3.代码演示(C++)
class Solution
{
public:
vector<int> decrypt(vector<int>& code, int k)
{
vector<int>ans;
int n=code.size();
int val=0;
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];
}
}
else if(k<0)
{
val=0;
for(int j=i-1;j>=i+k;j--)
{
val+=code[(j%n+n)%n];
}
}
ans.push_back(val);
}
return ans;
}
};
4.题目链接
四、1640.能否连接形成数组(简单)
1.题目描述
2.解题思路
首先定义两个指针,一个指针指向原数组,另一个指针指向pieces数组。
如果某一次遍历不能找到一块匹配的块,则返回false;如果匹配完整,则
原数组指针自增,当原数组指针等于数组长度时返回true;
3.代码演示(C++)
class Solution
{
public:
bool canFormArray(vector<int>& arr, vector<vector<int>>& pieces)
{
int i = 0, j, k;
bool flag = false;
while(i < arr.size())
{
flag = false;
for(j = 0; j < pieces.size(); ++j)
{
if(pieces[j][0] != arr[i])
{
continue;
}
for(k = 0; k < pieces[j].size(); ++k)
{
if(pieces[j][k] == arr[i])
{
++i;
flag = true;
}
else
{
return false;
}
}
if(i == arr.size())
{
return true;
}
}
if(!flag)
{
return false;
}
}
return true;
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!