目录
提莫攻击(easy)
题目解析
1.题目链接:. - 力扣(LeetCode)
2.题目描述
讲解算法原理
解法(模拟+分情况讨论):
算法思路:
模拟+分情况讨论。
计算相邻两个时间点的差值:
i. 如果差值⼤于等于中毒时间,说明上次中毒可以持续 duration 秒;
ii. 如果差值⼩于中毒时间,那么上次的中毒只能持续两者的差值。
编写代码
c++算法代码:
class Solution {
public:
int findPoisonedDuration(vector<int>& timeSeries, int duration) {
int ret = 0;
for(int i = 1; i < timeSeries.size(); i++)
{
int tmp = timeSeries[i] - timeSeries[i - 1];
if(tmp >= duration) ret += duration;
else ret += tmp;
}
return ret + duration;
}
};
java算法代码:
class Solution {
public int findPoisonedDuration(int[] timeSeries, int duration) {
int ret = 0;
for(int i = 1; i < timeSeries.length; i++) {
int x = timeSeries[i] - timeSeries[i - 1];
if(x >= duration) ret += duration;
else ret += x;
}
return ret + duration;
}
}
N字形变换(medium)
题目解析
1.题目链接:. - 力扣(LeetCode)
2.题目描述
讲解算法原理
解法(模拟+找规律):
算法思路:
找规律,⽤row代替⾏数,row=4时画出的N字形如下:02row-24row-4
12row-32row-14row-54row-3
22row-42row4row-64row-2
32row+14row-1
不难发现,数据是以2row-2为⼀个周期进⾏规律变换的。将所有数替换成⽤周期来表⽰的变量:第⼀⾏的数是:0,2row-2,4row-4;
第⼆⾏的数是:1,(2row-2)-1,(2row-2)+1,(4row-4)-1,(4row-4)+1;第三⾏的数是:2,(2row-2)-2,(2row-2)+2,(4row-4)-2,(4row-4)+2;第四⾏的数是:3,(2row-2)+3,(4row-4)+3。
可以观察到,第⼀⾏、第四⾏为差为2row-2的等差数列;第⼆⾏、第三⾏除了第⼀个数取值为⾏数,每组下标为(2n-1,2n)的数围绕(2row-2)的倍数左右取值。
以此规律,我们可以写出迭代算法。
编写代码
c++算法代码:
class Solution
{
public:
string convert(string s, int numRows)
{
// 处理边界情况
if(numRows == 1) return s;
string ret;
int d = 2 * numRows - 2, n = s.size();
// 1. 先处理第⼀⾏
for(int i = 0; i < n; i += d)
ret += s[i];
// 2. 处理中间⾏
for(int k = 1; k < numRows - 1; k++) // 枚举每⼀⾏
{
for(int i = k, j = d - k; i < n || j < n; i += d, j += d)
{
if(i < n) ret += s[i];
if(j < n) ret += s[j];
}
}
// 3. 处理最后⼀⾏
for(int i = numRows - 1; i < n; i += d)
ret += s[i];
return ret;
}
};
java算法代码:
class Solution
{
public String convert(String s, int numRows)
{
// 处理⼀下边界情况
if(numRows == 1) return s;
int d = 2 * numRows - 2, n = s.length();
StringBuilder ret = new StringBuilder();
// 1. 处理第⼀⾏
for(int i = 0; i < n; i += d)
ret.append(s.charAt(i));
// 2. 处理中间⾏
for(int k = 1; k < numRows - 1; k++) // 依次枚举中间⾏
{
for(int i = k, j = d - i; i < n || j < n; i += d, j += d)
{
if(i < n) ret.append(s.charAt(i));
if(j < n) ret.append(s.charAt(j));
}
}
// 3. 处理最后⼀⾏
for(int i = numRows - 1; i < n; i += d)
ret.append(s.charAt(i));
return ret.toString();
}
}