public int findMin(int[] num) { 3 if (num == null || num.length == 0) { 4 return 0; 5 } 6 7 int len = num.length; 8 if (len == 1) { 9 return num[0]; 10 } else if (len == 2) { 11 return Math.min(num[0], num[1]); 12 } 13 14 int left = 0; 15 int right = len - 1; 16 17 while (left < right - 1) { 18 int mid = left + (right - left) / 2; 19 // In this case, the array is sorted. 20 // 这一句很重要,因为我们移除一些元素后,可能会使整个数组变得有序... 21 if (num[left] < num[right]) { 22 return num[left]; 23 } 24 25 // left side is sorted. CUT the left side. 26 if (num[mid] > num[left]) { 27 left = mid; 28 // left side is unsorted, right side is sorted. CUT the right side. 29 } else if (num[mid] < num[left]) { 30 right = mid; 31 } else { 32 left++; 33 } 34 } 35 36 return Math.min(num[left], num[right]); 37 }