题1:二分查找 I
题目来源:[NC]160. 二分查找 I
题目
请实现有 无重复 数字的升序数组的二分查找
给定一个 元素有序的(升序)长度为 n 的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中出现的 target 的下标,如果目标值存在返回下标,否则返回 -1
数据范围:
进阶:时间复杂度 ,空间复杂度
时间复杂度:,其中
是数组的长度。
空间复杂度:
我的代码
public class Solution {public int search (int[] nums, int target) {// write code hereint start=0;int end =nums.length-1;while(start<=end){int mid=start+(end-start)/2;if(nums[mid]==target){return mid;}else if(nums[mid]<target){start=mid+1;}else{//mid>targetend=mid-1;}}return -1;}}
题2:二分查找 II
题目来源:[NC]105. 二分查找 II
题目
请实现有 重复 数字的升序数组的二分查找
给定一个 元素有序的(升序)长度为 n 的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的 target 的下标,如果目标值存在返回下标,否则返回 -1
数据范围:
进阶:时间复杂度 ,空间复杂度
示例1
输入:[1,2,4,4,5],4 返回值:2 说明: 从左到右,查找到第 1 个为 4 的,下标为 2 ,返回 2
时间复杂度:,其中
是数组的长度。
空间复杂度:
我的代码
public class Solution {public int search (int[] nums, int target) {int start=0;int end =nums.length-1;while(start<=end){if(nums[start]==target)return start; //1. 此处相等一定下标最小int mid=start+(end-start)/2;if(nums[mid]==target){ //2. 找到也继续向左区间找,但不丢失midend=mid;}else if(nums[mid]<target){start=mid+1;}else{end=mid-1;}}return -1;}}
