leetcode300最长递增子序列
注意:√
- 看了书后确实好写了不少,主要是注意当前的值和之前所有比自己小的值对比
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
Arrays.fill(dp,1);
int res = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]){
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
res = Math.max(res, dp[i]);
}
return res;
}
leetcode354. 俄罗斯套娃信封问题
注意:×
- 将这个套娃先按照
arr[i][0]
排个序,转换成最长递增子序列LIS的问题 - 一定要注意排序
Arrays.sort(envelopes, new Comparator<int[]>()
的写法!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
↓↓↓↓↓↓↓↓↓↓说人话就是想让A大放前面的话就拿A-B,B大放前面就B-A↓↓↓↓↓↓↓↓↓
o2[1]-o1[1]表示的是当两个数组的第一个元素相等时,比较它们第二个元素的大小。具体来说:
- 如果o2[1]-o1[1]的结果大于0,说明o2的第二个元素大于o1的第二个元素,那么在排序时o2会被安排在o1的后面,即按照第二个元素的升序排列。
- 如果o2[1]-o1[1]的结果小于0,说明o2的第二个元素小于o1的第二个元素,那么在排序时o1会被安排在o2的后面,即按照第二个元素的升序排列。
- 如果o2[1]-o1[1]的结果等于0,说明两个数组的第一个元素和第二个元素都相等,那么它们的相对位置无所谓。
同理,o1[0]-o2[0]表示的是当两个数组的第一个元素不相等时,比较它们第一个元素的大小,按照第一个元素的升序进行排列。
public class Solution {
@Test
public void test(){
int[][] arr = {{5,4},{6,4},{6,7},{2,3}};
System.out.println(maxEnvelopes(arr));
}
public int maxEnvelopes(int[][] envelopes) {
int n = envelopes.length;
Arrays.sort(envelopes, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0] == o2[0]? o2[1]-o1[1]: o1[0]-o2[0];
}
});
int[] height = new int[n];
for (int i = 0; i < envelopes.length; i++) {
height[i] = envelopes[i][1];
}
return lengthOfLIS(height);
}
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
Arrays.fill(dp,1);
int res = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]){
dp[i] = Math.max(dp[i], dp[j]+1);
}
}
res = Math.max(res, dp[i]);
}
return res;
}
}