今日完成例题:
二分查找
使用条件:1、数组为有序数
2、数组中无重复元素
思路:
首先要把要查找的目标target定义在一个区间里,如[left,right]或者[left,right),然后对这两个下标进行调整,最后锁定目标值target的下标,定义的区间不同则实现的方法也会不同,下面以这两个区间为例
//1.定义目标值target的搜索区间为[left,right]
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
int mid;
while(left<=right){
//防止数据溢出,等同于(left+right)/2
mid = left+(right-left)/2;
if(target>nums[mid]){
//经计算后可排除nums[mid],故下标取mid+1
left = mid+1;
}
else if(target<nums[mid]){
//与上同理
right = mid-1;
}
else {
return mid;
}
}
//若循环结束还未返回结果,说明target不存在与数组中
return -1;
}
//2.定义目标值target搜索区间为[left,right)
public int search(int[] nums, int target) {
int left = 0;
//依据搜索区间,right不能等于最大的下标nums.lenth-1,所以加+1变成nums.lenth
int right = nums.length;
int mid;
while(left<right){
//防止数据溢出,等同于(left+right)/2
mid = left+(right-left)/2;
if(target>nums[mid]){
//经计算后可排除nums[mid],故下标取mid+1
left = mid+1;
}
else if(target<nums[mid]){
//因为搜索区间为[left,right),所以右上限不能排除mid,因此不能-1
right = mid;
}
else {
return mid;
}
}
//若循环结束还未返回结果,说明target不存在与数组中
return -1;
}
移除元素
思路:数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖
可采用双指针的思想,对使用时间复杂度为O(n)的算法去解决这个问题
public int removeElement(int[] nums, int val) {
//设定两个快慢指针对数组进行扫描最后的出结果
int slow = 0;//慢指针
int quick =0;//快指针
for (;quick < nums.length; quick++) {
if(nums[quick] == val){
//若出现了要删除的数据时,慢指针不进行操作,快指针+1
//这样便跳过了删除的数据
continue;
}
nums[slow] = nums[quick];
slow++;
}
//slow也记录了新数组中的元素个数,故返回
return slow;
}
以上为本次算法学习的成果,谢谢观看!