题目
1.1572. 矩阵对角线元素的和
2.1573. 分割字符串的方案数
3.1574. 删除最短的子数组使剩余数组有序
4.1575. 统计所有可行路径
思路与算法
- 第一题不多bb第二题是个数学题,排列组合,找到那些关键节点就行了。
- 第三题找开头和结尾的有序端的关键节点,更新关键节点信息即可
- 第四题典型dp+dfs即可。
- 没啥时间写python和c++了,java将就看
代码实现
1.1572. 矩阵对角线元素的和
class Solution {
public int diagonalSum(int[][] mat) {
int len = mat.length;
int mid = len/ 2;
int ans = 0;
if (len == 1) {
return mat[0][0];
}
for (int i = 0; i < len; i++) {
ans += mat[i][i];
ans += mat[i][len - i - 1];
}
if (len % 2 != 0) {
ans -= mat[mid][mid];
}
return ans;
}
}
2.1573. 分割字符串的方案数
class Solution {
public int numWays(String s) {
int len = s.length();
int cnt = 0;
for (int i = 0; i < len; i++) {
if (s.charAt(i) == '1') {
cnt++;
}
}
if (cnt == 0) {
int n = len - 1;
return (int) ((1L * n * (n - 1) / 2) % 1000000007);
} else if (cnt % 3 != 0) {
return 0;
} else {
int k = cnt / 3;
int curCnt = 0;
int m = 0,n = 0;
for (int i = 0; i < len; i++) {
if (s.charAt(i) == '1') {
curCnt++;
if (curCnt == k) {
m = i;
}
if (curCnt == k + 1) {
m = i - m;
}
if (curCnt == k * 2) {
n = i;
}
if (curCnt == k * 2 + 1) {
n = i - n;
break;
}
}
}
return (int)((1L * m * n) % 1000000007);
}
}
}
3.1574. 删除最短的子数组使剩余数组有序
class Solution {
public int findLengthOfShortestSubarray(int[] arr) {
int len = arr.length;
int left = 0;
while (left + 1 < len && (arr[left] <= arr[left + 1])) {
left++;
}
// 全阶段有序,返回0
if (left == len - 1) {
return 0;
}
// 找出第一阶段有序的尾索引和第三阶段有序的头索引
int right = len - 1;
while (right >= 0 && (arr[right] >= arr[right-1])) {
right--;
}
// 极端情况,直接删除[0,right-1]或者[left+1,len-1]
int result = Math.min(len - 1 - left,right);
// 从之前找到的中间段的索引的两个端点开始遍历,判断增加哪个索引使有序
int i = 0,j = right;
while (i <= left && j <= len - 1) {
if (arr[i] <= arr[j]) {
result = Math.min(j - i - 1,result);
i++;
} else {
j++;
}
}
return result;
}
}
4.1575. 统计所有可行路径
class Solution {
int[][] map;
int dp[][];
public int countRoutes(int[] locations, int start, int finish, int fuel) {
int len = locations.length;
map = new int[len][len];
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
map[i][j] = Math.abs(locations[i] - locations[j]);
}
}
dp = new int[len][fuel + 1];
for (int[] temp : dp) {
Arrays.fill(temp, -1);
}
return dfs(start, finish, fuel);
}
private int dfs(int start, int finish, int fuel) {
if (dp[start][fuel] == -1) {
int temp = start == finish ? 1 : 0;
for (int i = 0; i < map.length; i++) {
if (i != start && map[start][i] <= fuel) {
temp += dfs(i, finish, fuel - map[start][i]);
temp %= 1000000007;
}
}
dp[start][fuel] = temp;
}
return dp[start][fuel];
}
}
写在最后
人生苦短,自己对得起自己就好。加油吧自己