当前位置:   article > 正文

Leetcode 第34场双周赛题解_leetcode 第 36 场双周赛题解

leetcode 第 36 场双周赛题解

前60名有奖,搞了个62名,还是菜。

5491. 矩阵对角线元素的和

思路:直接求和就行,只是n为奇数的时候中间的数会计算两次,所以要减去一次。

  1. class Solution {
  2. public int diagonalSum(int[][] mat) {
  3. int sum = 0;
  4. int n = mat.length;
  5. for (int i = 0; i < n; i++)
  6. sum += mat[i][i];
  7. for (int i = 0; i < n; i++) {
  8. if (i == n - 1 - i)
  9. continue;
  10. sum += mat[i][n - 1 - i];
  11. }
  12. return sum;
  13. }
  14. }

5492. 分割字符串的方案数

思路:本质上就是找到三段中两个间隔内零的个数,直接相乘即可。当然要特判掉一些特殊情况(比如:全是0或者无法分成三段时)

  1. class Solution {
  2. static int mod = 1000000007;
  3. public int numWays(String s) {
  4. int sum = 0;
  5. long ans = 0;
  6. int n = s.length();
  7. for (int i = 0; i < n; i++) {
  8. if (s.charAt(i) == '1')
  9. sum++;
  10. }
  11. if (sum % 3 != 0)
  12. return 0;
  13. if (sum == 0) {
  14. ans = n - 1;
  15. ans = ans * (ans - 1) / 2 % mod;
  16. return (int) ans;
  17. }
  18. sum /= 3;
  19. int l = 0, r = n - 1, now = 0;
  20. for (; l < n && now < sum; l++) {
  21. if (s.charAt(l) == '1')
  22. now++;
  23. }
  24. now = 0;
  25. for (; r >= 0 && now < sum; r--) {
  26. if (s.charAt(r) == '1')
  27. now++;
  28. }
  29. long left = 0, right = 0;
  30. while (s.charAt(l) == '0') {
  31. left++;
  32. l++;
  33. }
  34. while (s.charAt(r) == '0') {
  35. right++;
  36. r--;
  37. }
  38. left++;
  39. right++;
  40. //System.out.println(l + " " + r);
  41. ans = left;
  42. ans = ans * right % mod;
  43. return (int) ans;
  44. }
  45. }

5493. 删除最短的子数组使剩余数组有序

思路:这种类型的题基本就是换换包装,本质考察的知识一点没变,我们找到头和尾分别能组成的最长连续非递减子串,之后暴力左边的长度,然后二分右边的长度,中间的删掉,标记下最优答案即可。

  1. class Solution {
  2. public int findLengthOfShortestSubarray(int[] arr) {
  3. int n = arr.length;
  4. if (n <= 1) return 0;
  5. int l = 1, r = n - 2;
  6. while (l < n && arr[l] >= arr[l - 1]) l++;
  7. while (r >= 0 && arr[r] <= arr[r + 1]) r--;
  8. if (l == n || r < 0) return 0;
  9. //System.out.println(l + " " + r);
  10. int ans = Math.max(l, n - r - 1);
  11. for (int i = 0; i < l; i++) {
  12. int ls = r + 1, rs = n - 1, p = n;
  13. while (ls <= rs) {
  14. int mid = (ls + rs) / 2;
  15. if (arr[mid] >= arr[i]) {
  16. p = mid;
  17. rs = mid - 1;
  18. } else
  19. ls = mid + 1;
  20. }
  21. if (p != -1)
  22. ans = Math.max(ans, i + 1 + n - p);
  23. }
  24. return n - ans;
  25. }
  26. }

5494. 统计所有可行路径

思路:可以考虑采用记忆化搜索,直接统计方案数。【时间复杂度较高】

  1. class Solution {
  2. private int n;
  3. private int[] locations;
  4. private int mod = 1000000007;
  5. private Map<String, Integer> map;
  6. public int countRoutes(int[] locations, int start, int finish, int fuel) {
  7. n = locations.length;
  8. map = new HashMap<>();
  9. this.locations = locations;
  10. return dfs(start, finish, fuel);
  11. }
  12. private int dfs(int u, int end, int fuel) {
  13. if (fuel < 0) return 0;
  14. if (fuel == 0)
  15. return u == end ? 1 : 0;
  16. String s = String.valueOf(u) + "#" + String.valueOf(fuel);
  17. if (map.containsKey(s))
  18. return map.get(s);
  19. long res = (u == end ? 1 : 0);
  20. for (int i = 0; i < n; i++) {
  21. if (i == u)
  22. continue;
  23. res = (res + dfs(i, end, fuel - Math.abs(locations[u] - locations[i]))) % mod;
  24. }
  25. map.put(s, (int) res);
  26. return (int) res;
  27. }
  28. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/122870
推荐阅读
相关标签
  

闽ICP备14008679号