704. 二分查找
题目链接
难度
易
看到题目的第一想法
使用线性查找方法
看完代码随想录之后总结
解题思路:
1. 涉及基础知识
1)数组是存放在连续内存空间上的相同类型数据的集合
2)数组下标都是从0开始的。数组内存空间的地址是连续的
3)二维数组,python在内存的空间地址是连续的,java在内存的空间地址是不连续的
4)数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
2.二分法查找前提条件
1)有序性:数组必须是事先排序好的。如果数组无序,那么久无法判断目标值是在左侧还 是右侧,也就无法进行有效的折半操作了。
2)重复元素处理:如果数组中右重复元素,二分法查找可以找到其中一个匹配项,但通常不会指定是哪一个。如果需要找到所有匹配或者找到第一个或最后一个匹配项,则需要进行额外的逻辑。
3)效率问题:小规模数据集,二分不一定比线性查找快,因为二分涉及更多的比较和索引计算。但是数据集非常大时,二分的时间复杂度是O(log n)会明显优于线性查找O(n)。
3.解题思路
1)注意:区间的定义,明确left<=right(左闭右闭)或是left<right(左闭右开)时left以及right变更时的取值;时间复杂度:O(log n),空间复杂度:O(1)
#
2)文章讲解:代码随想录-数组-二分法查找
3)视频讲解:代码随想录-二分法查找-视频讲解
代码实现
python
class Solution:
def search(self, nums: List[int], target: int) -> int:
# 左闭右闭
left = 0
right = len(nums) - 1
while(left<=right):
mid = (left + right) // 2
if nums[mid] > target:
right = mid - 1
elif nums[mid] < target:
left = mid + 1
else:
return mid
return -1
class Solution:
def search(self, nums: List[int], target: int) -> int:
# 左闭右开
left = 0
right = len(nums)
while( left < right):
mid = (left + right) // 2
if nums[mid] > target:
right = mid
elif nums[mid] < target:
left = mid + 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) / 2;
if(nums[mid] > target){
right = mid - 1;
}else if(nums[mid] < target){
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
}
class Solution {
public int search(int[] nums, int target) {
// 左闭右开
int left = 0;
int right = nums.length;
while(left < right){
int mid = (left + right) / 2;
if(nums[mid] > target){
right = mid;
}else if(nums[mid] < target){
left = mid + 1;
}else{
return mid;
}
}
return -1;
}
}
27. 移除元素
题目链接
难度
简单
看到题目的第一想法
暴力解法
看完代码随想录之后的总结
1.涉及的基础知识
主要注意数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
2.解题思路
主要考察的是双指针的解法(快慢指针),时间复杂度:O(n),空间复杂度:O(1)。
3.代码实现
python
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow, fast = 0, 0
n = len(nums)
while(fast < n):
if nums[fast] != val:
nums[slow] = nums[fast]
slow += 1
fast += 1
return slow
java
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
int fast = 0;
int n = nums.length;
while(fast < n){
if(nums[fast] != val){
nums[slow++] = nums[fast];
}
fast++;
}
return slow;
}
}
今日收获
原来有刷过题目,不过只用了python,这次刷题主要是想把java一起练了(初学阶段),虽然刷过但是在写二分法查找的时候对边界的处理还是理解的不到位,看了视频讲解豁然开朗,相信理解以后再做相应题目的时候就会更加熟悉了。对于快慢指针相对较熟悉了,主要是练习了一下java的语法。