查找元素:
题目:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
1.顺序查找
int search(int* nums, int numsSize, int target){ int n=100; for(int i=0;i<n;i++) { if(nums[i] == target) { return i; } } return -1; }
2.二分法查找
前提:1.数组必须是升序;2.数组中无重复元素。
二分法查找中逻辑是比较简单,但是区间定义问题不好解决,区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作。
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right]。
因为定义target在[left, right]区间,所以有如下两点:
1.while (left <= right) 要使用 <=
2.if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1;
具体代码如下:
int search(int* nums, int numsSize, int target){ int low=0,mid; int high=numsSize-1; while(low<=high){ mid=(high+low)/2; if(nums[mid] == target){ return mid; }else if(nums[mid] < target){ low=mid+1; }else{ high=mid-1; } } return -1; }
第二种写法我也有点蒙,有大佬帮忙解决一下吗?