题
思
最近很难遇到做不出来的题了,有点没意思。。。
leetcode435
贪心,先按照右区间从小到大排个序,依次看能不能加入,只要当前左区间大于等于上一个的右区间就能加入,而且这个一定是最优解。
leetcode1754
贪心,显然谁的第一个字母大就加谁,如果相等,则看他们的后一个字母谁大,再相同就再看后一个……
所以写了一个方法判断两个字符串谁大。
leetcode1292
纯暴力居然也能过啊。
代码
leetcode435
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> a[1] - b[1]);
Stack<int[]> valid = new Stack<int[]>();
valid.push(intervals[0]);
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] >= valid.peek()[1]) {
valid.push(intervals[i]);
}
}
return intervals.length - valid.size();
}
}
leetcode1754
class Solution {
public String largestMerge(String word1, String word2) {
StringBuilder sb = new StringBuilder();
StringBuilder sb1 = new StringBuilder(word1);
StringBuilder sb2 = new StringBuilder(word2);
while (sb1.length() > 0 || sb2.length() > 0) {
if (compare(sb1, sb2)) {
sb.append(sb2.charAt(0));
sb2.deleteCharAt(0);
} else {
sb.append(sb1.charAt(0));
sb1.deleteCharAt(0);
}
}
return sb.toString();
}
private boolean compare(StringBuilder sb1, StringBuilder sb2) {
int idx = 0;
while (idx < Math.min(sb1.length(), sb2.length())) {
if (sb1.charAt(idx) < sb2.charAt(idx)) {
return true;
} else if (sb1.charAt(idx) > sb2.charAt(idx)) {
return false;
} else {
idx++;
}
}
if (sb1.length() <= sb2.length()) {
return true;
} else {
return false;
}
}
}
leetcode1292
class Solution {
public int maxSideLength(int[][] mat, int threshold) {
int maxLen = mat.length > mat[0].length ? mat.length : mat[0].length;
int len = 1;
while (len <= maxLen) {
int minSum = Integer.MAX_VALUE;
for (int i = 0; i + len <= mat.length; i++) {
for (int j = 0; j + len <= mat[0].length; j++) {
int squareSum = squareSum(mat, i, j, len, threshold);
minSum = squareSum < minSum ? squareSum : minSum;
}
}
if (minSum > threshold) {
break;
} else if (minSum == threshold) {
return len;
} else {
len++;
}
}
return len - 1;
}
private int squareSum(int[][] mat, int row, int col, int len, int threshold) {
int sum = 0;
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
sum += mat[row + i][col + j];
if (sum > threshold) {
return Integer.MAX_VALUE;
}
}
}
return sum;
}
}