20200916:leetcode34周双周赛题解

leetcode34周双周赛题解

题目

1.1572. 矩阵对角线元素的和

在这里插入图片描述
2.1573. 分割字符串的方案数
在这里插入图片描述
3.1574. 删除最短的子数组使剩余数组有序
在这里插入图片描述
4.1575. 统计所有可行路径
在这里插入图片描述

思路与算法

  1. 第一题不多bb第二题是个数学题,排列组合,找到那些关键节点就行了。
  2. 第三题找开头和结尾的有序端的关键节点,更新关键节点信息即可
  3. 第四题典型dp+dfs即可。
  4. 没啥时间写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];
    }
}



写在最后

人生苦短,自己对得起自己就好。加油吧自己

猜你喜欢

转载自blog.csdn.net/qq_36828395/article/details/108634000