0%

代码随想录训练营 Day 02 / 60

今日任务

  • [] 每日一题(LC-1187)
  • [] LC-977 有序数组的平方
  • [] LC-209 长度最小的子数组
  • [] LC-59 螺旋数组II

每日一题LC-1187

LC-300

做每日一题前先做了一道LC-300, 因为LC-1187的题解说这道题可以用300的方法。
这道题DP不是最优解要n^2的时间复杂度,主要思想是DP记录以i元素结尾最长的严格递增子序列长度,这样遍历每个元素如果比之前的大就比较一下+1后和之前是不是最大的。最近很多这种题目啊,DP是检查以i为结尾的xxxx,可以整理一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
Arrays.fill(dp, 1);
int maxVal = dp[0];
for (int i = 1; i < nums.length; i++) {
for (int j = 0; j <= i; j++) {
if (nums[j] < nums[i]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
}
maxVal = Math.max(dp[i], maxVal);
}

return maxVal;
}
}

贪心做法,使用了O(n)的查找方式,如果用二分的话可以更加快
主要思路就是让ans数组中尽可能小

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public int lengthOfLIS(int[] nums) {
if (nums.length == 0)
return 0;

int[] ans = new int[nums.length + 1]; // 每个元素表示子序列长度为i时子序列中元素的最小值
int len = 1;
ans[1] = nums[0];

for (int i = 1; i < nums.length; i++) {
if (nums[i] > ans[len]) {
ans[++len] = nums[i];
} else {
int index = 0;
for (int j = len; j > 0; j--) {
if (ans[j] < nums[i]) {
index = j;
break;
}
}
ans[index + 1] = nums[i];
}
}

return len;
}
}

LC-1187 使数组严格递增

题目链接