Lc_704二分查找
- 2021 年 7 月 2 日
- 筆記
- leetcode二刷
package com.example.leetcode2;
import java.util.*;
/**
* @description: 704. 二分查找
* 給定一個 n 個元素有序的(升序)整型數組 nums 和一個目標值 target ,寫一個函數搜索 nums 中的 target,如果目標值存在返回下標,否則返回 -1。
* <p>
* <p>
* 示例 1:
* <p>
* 輸入: nums = [-1,0,3,5,9,12], target = 9
* 輸出: 4
* 解釋: 9 出現在 nums 中並且下標為 4
* 示例 2:
* <p>
* 輸入: nums = [-1,0,3,5,9,12], target = 2
* 輸出: -1
* 解釋: 2 不存在 nums 中因此返回 -1
* <p>
* <p>
* 提示:
* <p>
* 你可以假設 nums 中的所有元素是不重複的。
* n 將在 [1, 10000]之間。
* nums 的每個元素都將在 [-9999, 9999]之間。
* @author: licm
* @create: 2021-06-29 11:34
**/
public class Lc_704二分查找 {
/**
* 二分查找的注意點
*
* 1.需要考慮邊界,不能重複使用 ,這裡使用左閉又開區間
* 2.數組要有序
* 3.如果有多個重複元素看是第一個還是最後一個,這個發生在等於目標值時的情況
* @param nums
* @param target
* @return
*/
public static int search(int[] nums, int target) {
if(nums.length==0){
return -1;
}
int left =0;
int right = nums.length-1;
while (left<=right){
int mid = (left+right)/2;
if(nums[mid] < target){
left = mid+1;
}else if(nums[mid]>target){
right = mid-1;
}else {
Deque deque = new ArrayDeque();
deque.add(mid);
int temp = mid-1;
while(true){
if(temp<0 || nums[temp]!=target){
break;
}
deque.addFirst(temp);
temp--;
}
temp = mid+1;
while(true){
if(temp>nums.length-1 || nums[temp]!=target){
break;
}
deque.addLast(temp);
temp++;
}
return (int)deque.getFirst();
}
}
return -1;
}
public static void main(String[] args) {
int[] nums = {-1,0,3,3,3,3,5,9,12};
int target = 3;
System.out.println(search(nums,target));
}
}