二分查找
要求:排序数组
写法:左闭又闭
复杂度为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