leetcode 704. 二分查找
leetcode 704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
思路
这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。
#include <stdio.h>// 二分查找算法 左闭右闭区间 [left, right]
int search(int* nums, int numsSize, int target) {int left=0,mid,right=numsSize-1;//左闭右闭区间 [left, right]while(left<=right) //左闭右闭区间,left == right是有意义的{mid=left + ((right - left) / 2);//防止两个数很大时,加法溢出if(nums[mid]==target)return mid;else if(nums[mid]<target)left=mid+1;else right=mid-1;}return -1;
}
int main()
{int nums[]={-1,0,3,5,9,12};int target=9,ret;ret=search(nums,sizeof(nums)/sizeof(nums[0]),target);if(ret==-1)printf("%d not found\n",target);elseprintf("%d found at index %d\n",target,ret);return 0;
}
35. 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
请必须使用时间复杂度为 O(log n) 的算法。
示例 1:
输入: nums = [1,3,5,6], target = 5
输出: 2
示例 2:
输入: nums = [1,3,5,6], target = 2
输出: 1
示例 3:
输入: nums = [1,3,5,6], target = 7
输出: 4
思路:
要在数组中插入目标值,无非是这四种情况
- 目标值在数组所有元素之前
- 目标值等于数组中某一个元素
- 目标值插入数组中的位置
- 目标值在数组所有元素之后
#include <stdio.h>/* 分别处理如下四种情况目标值在数组所有元素之前 返回插入0位置 return left=0目标值等于数组中某一个元素 return middle;目标值插入数组中的位置 [left, right],return left目标值在数组所有元素之后的情况 [left, right], return left(left=numsSize)*/
int searchInsert(int* nums, int numsSize, int target) {int left=0,right=numsSize-1;while(left<=right){int mid=left + (right - left) / 2; //防止溢出 (right+left)/2=(right-left+2*left)/2if(nums[mid]==target)return mid;else if(nums[mid]<target){left=mid+1;}else{right=mid-1;}}return left;//返回left满足以上情况
}
int main()
{int nums[]={1,3,5,6};int ret=searchInsert(nums,sizeof(nums)/sizeof(nums[0]),7);printf("%d\n",ret);return 0;
}