704 二分查找
解题思路
重点:定好区间
开闭:包含这个元素
左闭右闭:[left, right]
- left:
0
左侧初始下标 - right:
nums.length - 1
右侧初始下标 - middle
判断条件:确保 left <= right
left + ((right - left) >> 1)
:计算 middlenums[middle] < target]
:中间值小于目标值,目标值在右侧,更新 left 为middle + 1
nums[middle] > target]
: 中间值大于目标值,目标值在左侧,更新 right 为middle - 1
nums[middle] === target
:等于目标值,返回 middle
代码 Time complexity: O(logn) Space complexity: O(1)
var search = function(nums, target) {
var left = 0, right = nums.length-1, middle;
while(left<=right){
middle = left + ((right - left) >> 1);
if(nums[middle] > target){
right = middle -1;
}else if(nums[middle] < target){
left = middle + 1;
}else{
return middle;
}
}
return -1;
};
左闭右开:[left, right)
- left:
0
左侧初始下标 - right:
nums.length
右侧初始下标 - middle
判断条件:确保 left < right
left + ((right - left) >> 1)
:计算 middlenums[middle] < target]
:中间值小于目标值,目标值在右侧,更新 left 为middle + 1
nums[middle] > target]
: 中间值大于目标值,目标值在左侧,更新 right 为middle
nums[middle] === target
:等于目标值,返回 middle
代码 Time complexity: O(logn) Space complexity: O(1)
var search = function(nums, target) {
var left = 0, right = nums.length, middle;
while(left<right){
middle = left + ((right - left) >> 1);
if(nums[middle] > target){
right = middle;
}else if(nums[middle] < target){
left = middle + 1;
}else{
return middle;
}
}
return -1;
};
27.移除元素
解题思路
重点:双指针
- fast:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- slow:指向更新 新数组下标的位置
代码
Time complexity: O(n) Space complexity: O(1)
var removeElement = function(nums, val) {
var fast = 0, slow = 0;
for(; fast < nums.length; fast++){
if(nums[fast] !==val){
nums[slow++ ] = nums[fast];
}
}
return slow;
};
977.有序数组的平方
解题思路
数组有序,但负数平方之后可能成为最大数。那么数组平方的最大值就在数组的两端,不是最左就是最右,不可能是中间。 双指针法
- 左指针 left: 指向数组起始(最小负数)。
- 右指针 right:指向数组结尾(最大正数)。
注意:从后往前填充新数组:取 abs(nums[left]) 和 abs(nums[right]) 较大的数平方,填入结果数组的最后位置。 移动指针(较大平方数对应的指针向内移动)
代码
var sortedSquares = function(nums) {
var res=[],idx=nums.length-1;
for(var right = nums.length-1,left = 0;left<=right;){
if(nums[left] * nums[left] < nums[right] * nums[right]){
res[idx--] = (nums[right]*nums[right]);
right--;
}else{
res[idx--] = (nums[left] * nums[left]);
left++;
}
}
return res;
};