当前位置:   article > 正文

每日5题Day9 - LeetCode 41 - 45

每日5题Day9 - LeetCode 41 - 45

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前!

第一题:41. 缺失的第一个正数 - 力扣(LeetCode)

今天这道题没有ac,写不动了,下次再通过吧,先给个半成品下次回来改掉

  1. class Solution {
  2. public int firstMissingPositive(int[] nums) {
  3. //使用掩码来做吧,通过$与|来记录一下各个数是否有出现
  4. int mask = 0;
  5. int n = nums.length;
  6. // 将正整数放置到对应的位置
  7. for (int num : nums) {
  8. if (num > 0 && num <= n) {
  9. mask |= (1 << (num - 1));
  10. }
  11. }
  12. // 找到第一个缺失的正整数
  13. for (int i = 0; i < n; i++) {
  14. if ((mask & (1 << i)) == 0) {
  15. return i + 1;
  16. }
  17. }
  18. // 如果数组中包含了1到n之间的所有正整数,则缺失的是n+1
  19. return n + 1;
  20. }
  21. }


第二题:42. 接雨水 - 力扣(LeetCode)

  1. class Solution {
  2. public int trap(int[] height) {
  3. //单调站的传统题
  4. Deque<Integer> deque = new ArrayDeque<>();
  5. int res = 0;
  6. for(int i = 0; i < height.length; i++){
  7. while(!deque.isEmpty() && height[i] > height[deque.peekLast()]){
  8. int tmp = deque.pollLast();
  9. if(!deque.isEmpty()){
  10. //注意宽和高是如何得到的
  11. int h = Math.min(height[deque.peekLast()], height[i]) - height[tmp];
  12. int w = i - deque.peekLast() - 1;
  13. res += h * w;
  14. }
  15. }
  16. deque.offerLast(i);
  17. }
  18. return res;
  19. }
  20. }

第三题:43. 字符串相乘 - 力扣(LeetCode)

  1. class Solution {
  2. public String multiply(String num1, String num2) {
  3. //直接模拟就好
  4. int m = num1.length();
  5. int n = num2.length();
  6. int[] result = new int[m + n]; // 保存每一位的乘积结果
  7. // 逐位相乘,注意从个位加至高位
  8. for (int i = m - 1; i >= 0; i--) {
  9. for (int j = n - 1; j >= 0; j--) {
  10. int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0'); // 乘积
  11. int sum = mul + result[i + j + 1]; // 加上当前位的值
  12. result[i + j] += sum / 10; // 进位
  13. result[i + j + 1] = sum % 10; // 当前位的结果
  14. }
  15. }
  16. // 将结果数组转换为字符串
  17. StringBuilder sb = new StringBuilder();
  18. for (int digit : result) {
  19. if (!(sb.length() == 0 && digit == 0)) { // 忽略结果数组的前导零
  20. sb.append(digit);
  21. }
  22. }
  23. return sb.length() == 0 ? "0" : sb.toString();
  24. }
  25. }

第四题:44. 通配符匹配 - 力扣(LeetCode)

本题借用:【宫水三叶】的思路来解决的

  1. class Solution {
  2. public boolean isMatch(String ss, String pp) {
  3. int n = ss.length(), m = pp.length();
  4. // 技巧:往原字符头部插入空格,这样得到 char 数组是从 1 开始,而且可以使得 f[0][0] = true,可以将 true 这个结果滚动下去
  5. ss = " " + ss;
  6. pp = " " + pp;
  7. char[] s = ss.toCharArray();
  8. char[] p = pp.toCharArray();
  9. // f(i,j) 代表考虑 s 中的 1~i 字符和 p 中的 1~j 字符 是否匹配
  10. boolean[][] f = new boolean[n + 1][m + 1];
  11. f[0][0] = true;
  12. for (int i = 0; i <= n; i++) {
  13. for (int j = 1; j <= m; j++) {
  14. if (p[j] == '*') {
  15. //注意这个地方逻辑的判断:
  16. //条件一:不加'*'时的情况:f[i][j - 1]
  17. //条件二:(i - 1 >= 0 && f[i - 1][j])
  18. //满足其一即可为true
  19. f[i][j] = f[i][j - 1] || (i - 1 >= 0 && f[i - 1][j]);
  20. } else {
  21. //当字符为'?'时的判断逻辑,肯定要前面也满足true
  22. f[i][j] = i - 1 >= 0 && f[i - 1][j - 1] && (s[i] == p[j] || p[j] == '?');
  23. }
  24. }
  25. }
  26. return f[n][m];
  27. }
  28. }

 第五题:45. 跳跃游戏 II - 力扣(LeetCode)

  1. class Solution {
  2. public int jump(int[] nums) {
  3. //不dp了,可以直接贪心策略实现,少用点空间
  4. if(nums.length == 0 || nums.length == 1){
  5. return 0;
  6. }
  7. int cnt = 0, curlen = 0, maxlen = 0;
  8. for(int i = 0; i < nums.length; i++){
  9. maxlen = Math.max(maxlen, i + nums[i]);
  10. if(maxlen >= nums.length - 1){
  11. cnt++;
  12. break;
  13. }
  14. if(i == curlen){
  15. curlen = maxlen;
  16. cnt++;
  17. }
  18. }
  19. return cnt;
  20. }
  21. }

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

闽ICP备14008679号