上岸算法 | LeetCode Weekly Contest 第 272场周赛解题报告

卖大米 2021-12-21 314


【 NO.1 找出数组中的第一个回文字符串】

解题思路

签到题,遍历一次即可。

代码展示

class Solution {

   public String firstPalindrome(String[] words) {

       for (var w : words) {

           boolean found = true;

           for (int i = 0, j = w.length() - 1; i < j; i++, j--) {

               if (w.charAt(i) != w.charAt(j)) {

                   found = false;

                   break;

              }

          }

           if (found) {

               return w;

          }

      }

       return "";

  }

}

【 NO.2 向字符串添加空格】

解题思路

使用一个 StringBuilder 维护新的字符串。

代码展示

class Solution {

   public String addSpaces(String s, int[] spaces) {

       StringBuilder sb = new StringBuilder();

       int sp = 0;

       for (int i = 0; i < s.length(); i++) {

           if (sp < spaces.length && i == spaces[sp]) {

               sp++;

               sb.append(' ');

          }

           sb.append(s.charAt(i));

      }

       return sb.toString();

  }

}

【 NO.3 向字符串添加空格】

解题思路

双指针。

代码展示

class Solution {

   public long getDescentPeriods(int[] prices) {

       long result = 0;

       for (int i = 0, j = 0; i < prices.length; i++) {

           if (i > 0 && prices[i] != prices[i - 1] - 1) {

               j = i;

          }

           // [j, i] 是一个平滑下跌阶段

           result += i - j + 1;

      }

       return result;

  }

}

【 NO.4 使数组 K 递增的最少操作次数】

解题思路

原数组可以拆分成 K 个子数组,这 K 个子数组之间互不影响。

然后问题就变成了使一个数组变成递增的至少要改变几个元素,直接求最长递增子序列即可,使用 nlogn 的算法。

代码展示

class Solution {

   public int kIncreasing(int[] arr, int k) {

       int result = 0;

       for (int i = 0; i < k; i++) {

           List list = new ArrayList<>();

           for (int j = i; j < arr.length; j += k) {

               list.add(arr[j]);

          }

           result += increasing(list);

      }

       return result;

  }

   private int increasing(List nums) {

       // 将 nums 变成递增

       // nlogn 求 LIS

       int[] dp = new int[nums.size()];

       int len = 0;

       for (int num : nums) {

           int l = 0, r = len;

           while (l < r) {

               int mid = (l + r) / 2;

               if (dp[mid] <= num) { // 非严格递增,等于也可

                   l = mid + 1;

              } else {

                   r = mid;

              }

          }

           if (r >= len) {

               len++;

          }

           dp[r] = num;

      }

       return nums.size() - len;

  }

}

最新回复 (0)
返回