1、移動零(同向分3區域)
283. 移動零 - 力扣(LeetCode)
題目:
思路:注意原地操作。快排也是這個方法:左邊小于等于 tmp,右邊大于 tmp,最后 tmp 放到 dest。
代碼:
時間復雜度:0(n)
空間復雜度:0(1)
2、復寫零(同向模擬操作)
題目:1089. 復寫零 - 力扣(LeetCode)
思路:注意就地操作。
代碼:
class Solution {public void duplicateZeros(int[] arr) {// 求最后一個抄寫數int cur = -1;int dest = -1;int len = arr.length;while(dest < len - 1) {cur++;if(arr[cur] != 0) {dest++;} else {dest += 2;}}// 從后往前抄寫// 特殊處理if(dest == len) {arr[len-1] = 0;dest -= 2;cur--;}for(; cur >= 0; cur--) {arr[dest] = arr[cur];dest--;if(arr[cur] == 0) {arr[dest] = arr[cur];dest--;}}}
}
時間:n+常數=n
空間:3=1
3、快樂數(龜兔測循環鏈路)
題目:202. 快樂數 - 力扣(LeetCode)
思路:
代碼:
class Solution {// f 函數private int fun(int n) {int sum = 0;while(n > 0) {int tmp = n % 10;sum += tmp*tmp;n /= 10;}return sum;}public boolean isHappy(int n) {int slow = fun(n);int fast = fun(fun(n));while(slow != fast) {slow = fun(slow);fast = fun(fun(fast));}if (slow == 1) {return true;} else {return false;}}
}
時間:n
空間:2=1
4、盛水最多的容器(單調性,相撞)
題目:11. 盛最多水的容器 - 力扣(LeetCode)
思路:
代碼:
class Solution {public int maxArea(int[] height) {int left = 0;int right = height.length - 1;int max_r = 0;while(left < right) {int min_len = Math.min(height[left], height[right]);int tmp = (right - left) * min_len;if(min_len == height[left]) left++;else right--;if(tmp > max_r) {max_r = tmp;}}return max_r;}
}
時間:n
空間:1
5、有效三角形個數(單調性,相撞)
題目:611. 有效三角形的個數 - 力扣(LeetCode)
思路:圖中更優指,對于暴力枚舉,三角形判斷,法二更優。
代碼:
class Solution {public int triangleNumber(int[] nums) {Arrays.sort(nums);int sum = 0;for(int i = nums.length-1; i >= 2; i--) {// 固定最大值int c = nums[i];// 單調性規律int left = 0;int right = i-1;while(left < right) {if(nums[left] + nums[right] > c) {sum += right - left;right--;}else left++;}}return sum;}
}
6、和為 s 的兩個數字(單調性,相撞)
題目:LCR 179. 查找總價格為目標值的兩個商品 - 力扣(LeetCode)
思路:注意升序
代碼:
class Solution {public int[] twoSum(int[] price, int target) {int left = 0;int right = price.length-1;while(left < right) {if(price[left] + price[right] > target) right--;else if(price[left] + price[right] < target) left++;else return new int[]{price[left], price[right]};}// 沒找到return new int[]{};}
}