IT技術小屋

          秋風秋雨,皆入我心

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            38 隨筆 :: 1 文章 :: 19 評論 :: 0 Trackbacks
          Given a sorted array of integers, find the starting and ending position of a given target value.
          Your algorithm's runtime complexity must be in the order of O(log n).
          If the target is not found in the array, return [-1, -1].
          For example,
          Given [5, 7, 7, 8, 8, 10] and target value 8,
          return [3, 4].

          這個題目有遞歸和非遞歸兩個解法。
          遞歸解法:這個解法比較簡潔,代碼如下:
           1 public class SearchforaRange {
           2         public int[] searchRange(int[] A, int target) {
           3                 int low = findLow(A, target, 0, A.length - 1);
           4                 int high = findHigh(A, target, 0, A.length - 1);
           5                 int[] ret = new int[2];
           6                 ret[0] = low;
           7                 ret[1] = high;
           8                 return ret;
           9         }
          10 
          11         private int findLow(int[] A, int target, int l, int r) {
          12                 int mid = 0;
          13                 int ret = -1;
          14                 while (l <= r) {
          15                         mid = (l + r) / 2;
          16                         if (A[mid] == target) {
          17                                 ret = mid;
          18                                 int next = findLow(A, target, l, mid - 1);
          19                                 if (next != -1) {
          20                                         ret = next;
          21                                 }
          22                                 break;
          23                         } else if (A[mid] < target) {
          24                                 l = mid + 1;
          25                         } else {
          26                                 r = mid - 1;
          27                         }
          28 
          29                 }
          30                 return ret;
          31         }
          32 
          33         private int findHigh(int[] A, int target, int l, int r) {
          34                 int mid = 0;
          35                 int ret = -1;
          36                 while (l <= r) {
          37                         mid = (l + r) / 2;
          38                         if (A[mid] == target) {
          39                                 ret = mid;
          40                                 int next = findHigh(A, target, mid + 1, r);
          41                                 if (next != -1) {
          42                                         ret = next;
          43                                 }
          44                                 break;
          45                         } else if (A[mid] < target) {
          46                                 l = mid + 1;
          47                         } else {
          48                                 r = mid - 1;
          49                         }
          50                 }
          51                 return ret;
          52         }
          53 }

          非遞歸解法:以尋找左邊界為例,這個解法的思路就是一直向左進行二分查找,直到找到最左的目標元素或者最左的目標元素的下一個元素。因此,二分查找結束之后,需要判斷找到的元素到底是目標元素還是他的第一個不滿足的元素,然后根據情況返回下標。代碼實現如下:
           1 public class Solution {
           2     public int[] searchRange(int[] A, int target) {
           3         int left = findLeft(A, target);
           4         int right = findRight(A, target);
           5         return new int[] { left, right };
           6     }
           7 
           8     private int findLeft(int[] A, int target) {
           9         int i = 0, j = A.length - 1;
          10         while (i < j) {
          11             int mid = (i + j) / 2;
          12             if (A[mid] < target) {
          13                 i = mid + 1;
          14             } else {
          15                 j = mid - 1;
          16             }
          17         }
          18         if (A[i] == target) return i;
          19         if (i < A.length - 1 && A[i + 1] == target) return i + 1;
          20         return -1;
          21     }
          22 
          23     private int findRight(int[] A, int target) {
          24         int i = 0, j = A.length - 1;
          25         while (i < j) {
          26             int mid = (i + j) / 2;
          27             if (A[mid] > target) {
          28                 j = mid - 1;
          29             } else {
          30                 i = mid + 1;
          31             }
          32         }
          33         if (j >= 0 && A[j] == target)
          34             return j;
          35         if (j > 0 && A[j - 1] == target)
          36             return j - 1;
          37         return -1;
          38     }
          39 }
          posted on 2013-12-23 09:58 Meng Lee 閱讀(173) 評論(0)  編輯  收藏 所屬分類: Leetcode
          主站蜘蛛池模板: 三门峡市| 平谷区| 大兴区| 屏东县| 江都市| 双柏县| 龙胜| 榆树市| 阿坝县| 武功县| 嘉义市| 黄骅市| 东辽县| 保定市| 松阳县| 东宁县| 陈巴尔虎旗| 石嘴山市| 潼关县| 上林县| 慈溪市| 塔城市| 平顶山市| 金湖县| 洛隆县| 山东省| 开鲁县| 宜宾市| 辽阳市| 五华县| 融水| 信阳市| 康马县| 灵丘县| 云和县| 洪江市| 巫山县| 绿春县| 花莲县| 杂多县| 陇川县|