二分查找
要求:排序数组
写法:左闭又闭
复杂度为log时考虑二分
int left = 0, right = nums.length - 1;int mid = right / 2;while (left <= right) {if (nums[mid] == target) return mid;else if (nums[mid] > target) {right = mid - 1;mid = (left + right) / 2;}else {left = mid + 1;mid = (left + right) / 2;}}
找平方根
class Solution {public int mySqrt(int x) {int l = 0, r = x, ans = -1;while (l <= r) {int mid = (l + r) / 2;if ((long) mid * mid <= x) {ans = mid;l = mid + 1;} else {r = mid - 1;}}return ans;}}
双指针
27. 移除元素
class Solution {public int removeElement(int[] nums, int val) {int slowIndex = 0, fastIndex = 0;int size = nums.length;for ( ; fastIndex < size; ++fastIndex) {if (nums[fastIndex] != val) {nums[slowIndex] = nums[fastIndex];slowIndex++;}}return slowIndex;}}
977. 有序数组的平方
class Solution {public int[] sortedSquares(int[] nums) {int left = 0, right = nums.length - 1;int[] res = new int[nums.length];int flag = right;for (int i = 0; i <= right; ++i) {nums[i] *= nums[i];}while (flag >= 0) {if (nums[left] > nums[right]) {res[flag] = nums[left];flag--;left++;}else {res[flag] = nums[right];flag--;right--;}}return res;}}
滑动窗口
209. 长度最小的子数组
内层 本题窗口中的数要大于等于target
class Solution {public int minSubArrayLen(int target, int[] nums) {int slow = 0, fast = 0;int len = nums.length;int sum = 0;int res = Integer.MAX_VALUE;while (fast < len) {sum += nums[fast];while (sum >= target) {res = Math.min(res, fast - slow + 1);sum -= nums[slow];slow++;}fast++;}return res == Integer.MAX_VALUE ? 0 : res;}}
904. 水果成篮
内层 本题窗口中水果种类不能大于2
