问题描述:寻找反转序列中最小的元素。
算法分析:和寻找某个数是一个道理,还是利用二分查找,总体上分两种情况。nums[left]<=nums[mid],else。但是,在截取子序列的时候,有可能得到一个顺序序列。如34512,截取后得到12,此时要对这种情况判断,因为是顺序的,所以,最左边的元素就是最小元素。这点区别于寻找target,因为寻找target是根据target和left,mid,right做比较判断的。所以就不用对这种顺序情况单独讨论了。
1 public int findMin(int[] nums) 2 { 3 return findMin(nums, 0, nums.length - 1); 4 } 5 //递归 6 public int findMin(int[] nums, int left, int right) 7 { 8 if(left == right) 9 { 10 return nums[left]; 11 } 12 if(nums[left] < nums[right])//例如34512,在截取子序列时候,很可能就得到一个顺序序列,这时候直接判断。 13 { 14 return nums[left]; 15 } 16 int mid = (left+right)/2; 17 if(nums[left] < nums[mid]) 18 { 19 return findMin(nums, mid+1, right); 20 } 21 else 22 { 23 return findMin(nums, left, mid); 24 } 25 } 26 27 //迭代 28 public int findMin2(int[] nums, int left, int right) 29 { 30 while(left <= right) 31 { 32 if(nums[left] < nums[right]) 33 { 34 return nums[left]; 35 } 36 if(left == right) 37 { 38 return nums[left]; 39 } 40 int mid = (left+right)/2; 41 if(nums[left] <= nums[mid]) 42 { 43 left = mid + 1; 44 } 45 else 46 { 47 right = mid; 48 } 49 } 50 return -1; 51 }