1. 程式人生 > >LeetCode筆記——34在排序陣列中查詢元素的第一和最後一個位置

LeetCode筆記——34在排序陣列中查詢元素的第一和最後一個位置

題目:

給定一個按照升序排列的整數陣列 nums,和一個目標值 target。找出給定目標值在陣列中的開始位置和結束位置。

你的演算法時間複雜度必須是 O(log n) 級別。

如果陣列中不存在目標值,返回 [-1, -1]

示例 1:

輸入: nums = [5,7,7,8,8,10], target = 8
輸出: [3,4]

示例 2:

輸入: nums = [5,7,7,8,8,10], target = 6
輸出: [-1,-1]

思路:根據時間複雜度可以知道使用二分法。二分法是用來在有序陣列中查詢元素。借鑑網上大神們的程式碼。

程式碼:

class Solution {     public int[] searchRange(int[] nums, int target) {           int i = 0, j = nums.length;         int mid = (i + j) / 2;

        int p = -1;         while (i < j) {            //二分法查詢第一個與給定元素相同的元素,並將下標賦給p;如果找不到,則p值為-1             if (nums[mid] == target) {                 p = mid;                 break;             }             if (nums[mid] > target) {                 if (j == mid) break;  //注意邊界                 j = mid;                 mid = (i + j) / 2;             } else {                 if (i == mid) break;                 i = mid;                 mid = (i + j) / 2;             }         }

        if (p == -1) {  //找不到該元素             return new int[]{-1, -1};         } else {        //以找到的第一個元素為起點,前後排查是否還有相同的元素             int a = p, b = p;             while (a > 0 && nums[a - 1] == target) a--;             while (b < nums.length - 1 && nums[b + 1] == target) b++;             return new int[]{a, b};    //建立陣列的寫法         }     } }

執行最快的程式碼:

基本上也是二分法的思想

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int[] result = new int[2];
        if (nums == null || nums.length == 0 || target < 0) {
            result[0] = -1;
            result[1] = -1;
            return result;
        }
       
        result[0] = findFirst(nums, target);
        result[1] = findLast(nums, target);
        
        return result;
    }
    public int findFirst (int[] nums,int target) {
        int index = -1;
        int low = 0;
        int high = nums.length - 1;
        int mid;
        
        while(low <= high) {
            mid = (low + high) >> 1;
            
            if (nums[mid] > target) {
                high = mid - 1;
            } else if (nums[mid] < target) {
                low = mid + 1;
            } else {
                index = mid;
                high = mid - 1;
            }
        }
        
        return index;
    }
    public int findLast (int[] nums,int target) {
        int index = -1;
        int low = 0;
        int high = nums.length - 1;
        int mid;
        
        while(low <= high) {
            mid = (low + high) >> 1;
            
            if (nums[mid] > target) {
                high = mid - 1;
            } else if (nums[mid] < target) {
                low = mid + 1;
            } else {
                index = mid;
                low = mid + 1;
            }
        }
        
        return index;
    }
}