最近状态几何级下降,该多刷刷题了
思路:直接三层for循环找就好了。
class Solution {
public int countGoodTriplets(int[] arr, int a, int b, int c) {
int ans = 0;
int len = arr.length;
for (int i = 0; i < len; i++)
for (int j = i + 1; j < len; j++)
for (int k = j + 1; k < len; k++)
if (Math.abs(arr[i] - arr[j]) <= a && Math.abs(arr[j] - arr[k]) <= b && Math.abs(arr[i] - arr[k]) <= c)
ans++;
return ans;
}
}
思路:对于每个玩家我们可以通过单调栈找到这个玩家能赢多少次,如果遍历到最大值之前发现大家都不能赢到k次,呢肯定只有最大的能赢k次。
class Solution {
public int getWinner(int[] arr, int k) {
int mx = 0;
int len = arr.length;
int[] p = new int[len];
Stack<Integer> st = new Stack<>();
for (int i = 0; i < len; i++) {
while (!st.isEmpty() && arr[st.peek()] < arr[i]) {
p[st.peek()] += i - st.peek() - 1;
st.pop();
}
if (mx > 0 && mx < arr[i])
p[i]++;
st.add(i);
mx = Math.max(mx, arr[i]);
}
for (int i = 0; i < len; i++)
if (p[i] >= k || mx == arr[i])
return arr[i];
return mx;
}
}
思路:冒泡排序变形题。每次只能相邻的两行交换顺序,要加一点贪心,若当前已经满足条件(当前行末尾0的个数大于等于n-1-i个),则不用进行交换。因此我们找到在这行下边第一个能够使当前行满足条件的行就行了。
class Solution {
public int minSwaps(int[][] grid) {
int n = grid.length;
int[] sum = new int[n];
int num = n - 1, ans = 0;
for (int i = 0; i < n; i++)
for (int j = n - 1; j >= 0 && grid[i][j] != 1; j--)
sum[i]++;
for (int i = 0; i < n; i++) {
if (sum[i] >= num - i) continue;
for (int j = i + 1; j < n; j++) {
if (sum[j] >= num - i) {
ans += j - i;
int tmp = sum[j];
int p = j;
while (p > i) {
sum[p] = sum[p - 1];
p--;
}
sum[i] = tmp;
break;
}
}
}
for (int i = 0; i < n; i++) {
if (sum[i] < num - i)
return -1;
}
return ans;
}
}
思路:本质上这道题是将两个数组中的相同点缩成一个点,然后两个数组呈现“麻花”状,对于每一小节,我们只保留最大的呢一个子数组的和即可。
class Solution {
public int maxSum(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
int i, j;
long s1 = 0, s2 = 0;
for (i = len1 - 1, j = len2 - 1; i >= 0 && j >= 0; ) {
if (nums1[i] > nums2[j]) s1 += nums1[i--];
else if (nums1[i] < nums2[j]) s2 += nums2[j--];
else {
s1 = s2 = Math.max(s1, s2) + nums1[i];
i--;
j--;
}
}
for (; i >= 0; i--) s1 += nums1[i];
for (; j >= 0; j--) s2 += nums2[j];
return (int) (Math.max(s1, s2) % 1000000007);
}
}