LeetCode704.二分查找
链接:(704.二分查找)
题目描述:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
题目就叫二分查找,我们自然就知道这道题用二分查找来解决,通过这道题,我们也可以发现使用二分查找的一个条件:**数组有序,且数组中各元素不重复**
很容易可以写出如下代码:
public int search(int[] nums, int target) {
if(nums.length==0 || target<nums[0] || target>nums[nums.length-1]){
return -1;
}
int left=0;
int right=nums.length-1;
while(left<=right){
int mid=left+((right-left)>>1);
if(nums[mid]<target){ //target在mid右边
left=mid+1;
}else if(nums[mid]>target){ //target在mid左边
right=mid-1;
}else{
return mid;
}
}
// 没找到
return -1;
}
测试用例:
1.target<nums[0]
2.target>nums[nums.length-1]
3.nums[0]<target<nums[nums.length-1]且存在
4.nums[0]<target<nums[nums.length-1]且不存在
5.nums为空
LeetCode27.移除元素
链接:27.移除元素
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用
O(1)
额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
看到这个题目,我脑子里没有啥空间复杂度为O(1)的解法,那就用暴力吧,暴力解法就是两个for循环,如下
public int removeElement(int[] nums, int val) {
if(nums.length==0){
return 0;
}
int count=nums.length;
for(int i=0;i<count;i++){
if(nums[i]==val){
count--;
for(int j=i+1;j<nums.length;j++){
nums[j-1]=nums[j];
}
i--;
}
}
return count;
}
难道就没更好的解法了吗,我去看了题解,恍然大悟,答案就是双指针,
定义快慢指针
- 快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
- 慢指针:指向更新 新数组下标的位置
代码如下:
public int removeElement(int[] nums, int val) {
if(nums.length==0){
return 0;
}
int slow=0;
for(int fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
测试用例:
1.数组中包含要移除的元素
2.数组中不包含要移除的元素
3.数组中只有要移除的元素
4.数组中没有元素