每一步向前都是向自己的夢想更近一步,堅持不懈,勇往直前!
第一題:71. 簡化路徑 - 力扣(LeetCode)
class Solution {public String simplifyPath(String path) {Deque<String> stack = new LinkedList<>();for (String item : path.split("/")) {//如果是倆點,上一級不為空,則出棧(返回上一級)if (item.equals("..")) {if (!stack.isEmpty()) stack.pop();} else if (!item.isEmpty() && !item.equals(".")) stack.push(item);//否則,如果是正常的一個點. 代表進入下一級}String res = "";for (String d : stack) res = "/" + d + res;return res.isEmpty() ? "/" : res; }
}
第二題:72. 編輯距離 - 力扣(LeetCode)
class Solution {public int minDistance(String word1, String word2) {//經典dp題,題目要求最小操作數int m = word1.length(), n = word2.length();int[][] dp = new int[m + 1][n + 1];//初始化一下特殊情況dp[0][0] = 0;for(int i = 1; i <= m; i++){dp[i][0] = i;}for(int j = 1; j <= n; j++){dp[0][j] = j;}//給出遞推公式for(int i = 1; i <= m; i++){for(int j = 1; j <= n; j++){if(word1.charAt(i - 1) == word2.charAt(j - 1)){//注意所設dp范圍,所以相等的時候是word1.charAt(i - 1) == word2.charAt(j - 1)dp[i][j] = dp[i - 1][j - 1];}else{//三種情況,從第一個字符串的角度來說是增加:dp[i - 1][j]//修改:dp[i - 1][j - 1] 刪除:dp[i][j - 1])//在這三者中取到最小的一種,增加1dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i - 1][j - 1], dp[i][j - 1])) + 1;}}}return dp[m][n];}
}
第三題:73. 矩陣置零 - 力扣(LeetCode)
class Solution {public void setZeroes(int[][] matrix) {int m = matrix.length;int n = matrix[0].length;// 定義兩個數組來跟蹤需要置零的行和列boolean[] zeroRows = new boolean[m];boolean[] zeroCols = new boolean[n];// 遍歷矩陣以標記包含零的行和列for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (matrix[i][j] == 0) {zeroRows[i] = true;zeroCols[j] = true;}}}// 將零置于行for (int i = 0; i < m; i++) {if (zeroRows[i]) {for (int j = 0; j < n; j++) {matrix[i][j] = 0;}}}// 將零置于列for (int j = 0; j < n; j++) {if (zeroCols[j]) {for (int i = 0; i < m; i++) {matrix[i][j] = 0;}}}}
}
第四題:74. 搜索二維矩陣 - 力扣(LeetCode)
public class Solution {public boolean searchMatrix(int[][] matrix, int target) {//由于題目提到了每一行第一個數>上一行最后一個數//明顯提示了使用二分查找int m = matrix.length;int n = matrix[0].length;int left = -1;int right = m * n;while (left + 1 < right) {int mid = (left + right) >>> 1;int x = matrix[mid / n][mid % n];if (x == target) {return true;}if (x < target) {left = mid;} else {right = mid;}}return false;}
}
?第五題:75. 顏色分類 - 力扣(LeetCode)
class Solution {public void sortColors(int[] nums) {//直接快排quicksort(nums, 0, nums.length - 1);return;}private static void quicksort(int[] nums, int low, int high){if(low < high){int partindex = partition(nums, low, high);quicksort(nums, low, partindex - 1);quicksort(nums, partindex + 1, high);return;}}private static int partition(int[] nums, int low, int high){int pivot = nums[high];int i = low - 1;for(int j = low; j < high; j++){if(nums[j] < pivot){i++;int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}int tmp = nums[high];nums[high] = nums[i + 1];nums[i + 1] = tmp;return i + 1;}
}
class Solution {public void sortColors(int[] nums) {//刷油漆法,這個思路是真強啊int n0 = 0, n1 = 0;for (int i = 0; i < nums.length; i++) {int num = nums[i];//刷油漆法,先全部刷為2nums[i] = 2;//如果該值為1或0 那么我們往后刷一個1出來if (num < 2) {nums[n1++] = 1;}//和上面做法一樣,我們直接刷為0if (num < 1) {nums[n0++] = 0;}}}
}