数组
- 理论基础
- 数组是存放在连续内存空间上的相同类型数据的集合。
- 注意:1、数组下标都是从0开始的。2、数组内存空间的地址是连续的
- 因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。例如删除下标为3的元素,需要对下标为3的元素后面的所有元素都要做移动操作
- 数组的元素是不能删的,只能覆盖。
class Solution {
public int search(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
if(nums[i]==target){
return i;
}
}
return -1;//原先还设置了一个flag变量,结果多此一举了。
}
}
- 二分查找前提是阵列为集群阵列,同时还备份阵列中无重复元素,因为一旦有重复元素,使用二分法返回的元素下标可能不是唯一的。
- 方法一:左闭右闭。定义目标在[左,右]区间,所以有如下两点:
1、while (left <= right) 要使用 <= ,因为 left == right 是有意义的,所以使用 <=。
2、if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
class Solution {
public int search(int[] nums, int target) {
int left=0,right=nums.length-1;
while(left<=right){
int mid=(left+right)/2;
if(target<nums[mid])
right=mid-1;
else if(target>nums[mid])
left=mid+1;
else
return mid;
}
return -1;
}
}
- 方法二:左闭右开。定义目标在[左,右)区间,所以有如下两点:
1、- while (left < right),这里使用 < ,因为 left == right 在区间[left, right) 是没有意义的。
2、- if (nums[middle] > target) right 更新为 middle,因为当前 nums[middle] 不等于 target,左去区间继续寻找,而寻找区间是左闭右开区间,所以 right 更新为 middle,即:下一个查询区间不会去比较nums[middle]
class Solution {
public int search(int[] nums, int target) {
int left=0,right=nums.length;
while(left<=right){
int mid=(left+right)/2;
if(target<nums[mid])
right=mid;
else if(target>nums[mid])
left=mid+1;
else
return mid;
}
return -1;
}
}