代码随想录算法训练营第一天| 704、二分查找 27、移除元素
Leetcode 704 二分查找
题目链接:https://leetcode.cn/problems/binary-search/description/
思路一:直接采用二分法
通过mid = left + (right - left)/2 的值与target进行比较,进行二分操作,更新left、right的值
分为下列三种情况:
1、nums[mid]<target
2、nums[mid]>target
3、nums[mid] == target
代码:
class Solution {
public int search(int[] nums, int target) {
// 排除target<0||target>nums[nums.length - 1]
if((target<nums[0])||target>nums[nums.length - 1]){
return -1;
}
int left = 0 , right = nums.length - 1;
// 左闭右闭
while(left<=right){
int mid = left + (right-left)/2;
if(nums[mid]<target){
left = mid + 1;
}
else if(nums[mid]>target){
right = mid -1;
}
else if(nums[mid] == target){
return mid;
}
}
return -1;
}
}
思路二:递归
class Solution {
public int search(int[] nums, int target) {
return rereSearch(nums , 0 ,nums.length -1 ,target);
}
// 采用递归方法
private int rereSearch(int[] nums,int left,int right,int target){
if(left > right){
return -1;
}
int mid = left + (right-left)/2;
if(nums[mid]<target){
return rereSearch(nums,mid+1,right,target);
}
else if(nums[mid]>target){
return rereSearch(nums,left,mid - 1,target);
}
else if(nums[mid] == target){
return mid;
}
return -1;
}
}
总结:
1、注意弄清下标值与数组中每一项再与target进行对比
2、注意排除边界值
3、一开始我在if 、elseif 那里就没有判断好mid与nums[mid],误写成了mid<target情况
Leetcode 27 移除元素
题目链接:https://leetcode.cn/problems/remove-element/description/
题目描述:给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
思路 : 双指针法
声明两个快慢指针,快指针用来遍历数组并寻找与val中一样的值,slow用来指向更新 新数组下标的位置
class Solution {
public int removeElement(int[] nums, int val) {
// 双指针法
int slow = 0;
for(int fast = 0; fast<nums.length;fast++){
if(nums[fast] !=val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
总结:
双指针的时间复杂度O(n) 空间复杂度O(1)
暴力枚举双循环的时间复杂度为O(n^2),空间复杂度O(1)