之前对于left和right的开闭应用都比较混乱,第一次搞懂了左闭右闭区间和左开右闭区间两种不同方法的归类:
“区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:
while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1” (来源:代码随想录)
Python:
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left = 0
right = len(nums) - 1
while left <= right:
mid = (left- right) // 2
if nums[mid] < target:
mid = left + 1
elif nums[mid] > target:
mid = right - 1
else:
return mid
return -1
Java:
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while(left <= right){
int mid = left + ((right - left) >> 1);
if(nums[mid] < target){
left = mid + 1;
} else if(nums[mid] > target) {
right = mid - 1;
} else{
return mid;
}
}
return -1;
}
}
小知识点:(right - left) >> 1
这部分首先计算 right
和 left
之间的差,然后将其结果向右移动1位。由于是算术右移,所以如果 right - left
的结果是正数,那么结果相当于除以2(/ 2
),如果是负数,则相当于向下取整的除以2(/ -2
)。最终,mid
被赋值为 left
加上 (right - left) >> 1
的结果,这通常用于计算两个数之间的中点(中间值)。
使用快慢指针法,快指针探索新元素,慢指针在后根据快指针元素判断结果赋值创建新数组
java:
class Solution {
public int removeElement(int[] nums, int val) {
int fastIndex = 0;
int slowIndex;
for(slowIndex = 0;fastIndex < nums.length; fastIndex++){
if(nums[fastIndex] != val){
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}
python:
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
slowIndex = 0
for fastIndex in range(len(nums)):
if nums[fastIndex] != val:
nums[slowIndex] = nums[fastIndex]
slowIndex += 1
return slowIndex