704.二分查找
状态:快速AC了
思路
关键条件:升序(二分的关键)、无重复元素(无重复索引)
注意:要分清边界条件,left<=right还是left<right。left=mid+1,right=mid-1
代码
时间复杂度:O(log(n)) 空间复杂度:O(1)
class Solution {
public int search(int[] nums, int target) {
int res = -1;
if(target < nums[0] || target > nums[nums.length - 1]) return res;
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] == target){
res = mid;
break;
}else if(nums[mid] > target){
right = mid - 1;
}else{
left = mid + 1;
}
}
return res;
}
}
27.移除元素
状态:有一些细节问题需要注意——相向双指针,快慢指针
思路
注意:边界条件,需要在脑中思考一下两个指针的位置
代码
相向双指针
时间复杂度:O(n) 空间复杂度:O(1)
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
// 注意这里的细节
if (nums[left] == val) {
nums[left] = nums[right];
right--;
} else {
left++;
}
}
return left;
}
}
快慢指针
时间复杂度:O(n) 空间复杂度:O(1)
class Solution {
public int removeElement(int[] nums, int val) {
int fast = 0, low = 0;
while(fast < nums.length){
if(nums[fast] != val){
nums[low] = nums[fast];
low++;
}
fast++;
}
return low;
}
}
977.有序数组的平方
题目:977. 有序数组的平方 - 力扣(LeetCode)
状态:还是没想到关键点
思路
关键条件:数组两端一定是最大值,通过判断一定可以确认最大值
注意:双指针,新建一个结果数组
代码
时间复杂度:O(n) 空间复杂度:O(n)
class Solution {
public int[] sortedSquares(int[] nums) {
int[] res = new int[nums.length];
int left = 0, right = nums.length - 1;
int index = nums.length - 1;
while(left <= right){
if(nums[left] * nums[left] <= nums[right] * nums[right]){
res[index--] = nums[right] * nums[right];
right--;
}else{
res[index--] = nums[left] * nums[left];
left++;
}
}
return res;
}
}