题目
思路与算法
- 第一题没什么难度,StringBuilder拼接即可
- 第二题一开始想复杂了,用了HashSet进行判断,结果还超时了,后面开窍想到了简单的办法,精髓是:当开的灯的数目和当前开灯时刻的最大值相等时,此时满足全蓝的要求。结束
代码实现
5352:生成每种字符都是奇数个的字符串
class Solution {
public String generateTheString(int n) {
if(n == 1){
return "a";
}else if(n % 2 == 0){
StringBuilder sb1 = new StringBuilder();
for ( int i = 0 ;i < n-1;i++){
sb1.append('a');
}
sb1.append('b');
return sb1.toString();
} else {
StringBuilder sb = new StringBuilder();
for ( int i = 0 ;i < n-2;i++){
sb.append('a');
}
sb.append('b');
sb.append('c');
return sb.toString();
}
}
}
5353:灯泡开关 III
法一:超时
package com.immunize.leetcode.numTimesAllBlue;
import java.util.HashSet;
/**
* TLE
*
* @author Mr IMMUNIZE
*
*/
public class Solution {
public int numTimesAllBlue(int[] light) {
int count = 0;
int count1 = 0;
int len = light.length;
int[] mark = new int[len];
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < len; i++) {
set.add(light[i]);
for (int j = 1; j <= i + 1; j++) {
if (set.contains(j)) {
count1++;
}
}
if (count1 == i + 1) {
mark[i] = 1;
} else {
mark[i] = -1;
}
count1 = 0;
}
for (int k = 0; k < len; k++) {
if (mark[k] == 1) {
count++;
}
}
return count;
}
}
法二:过
package com.immunize.leetcode.numTimesAllBlue;
/**
* 过
*
* @author Mr IMMUNIZE
*
*/
public class Solution2 {
public int numTimesAllBlue(int[] light) {
int count1 = 0;
int count2 = 0;
int max = 0;
for (int i = 0; i < light.length; i++) {
count1 = i + 1;
max = Math.max(max, light[i]);
if (max == count1) {
count2++;
}
}
return count2;
}
}
复杂度分析
超时的复杂度为O(N²)
没超时的都是一遍遍历:O(N)