LeetCode: Search in Rotated Sorted Array I & II

首先要注意二分法。

二分法的终止条件是:low > high,而不是low >= high。因为在某些情况下,low == high的下一步就是就是low > high,而low == high恰是范围缩小到一个元素的情况。

二分法的更新操作。是将mid-1赋值给high,或者将mid+1赋值给low。而不是mid赋值给high或low。当只有2个元素的时候,会形成无线循环。所以每次要缩小范围。

 

这道题一共做了三种算法。第一种是用二分法先找到数组中的最大元素,确定两段数组分别的位置。然后再根据target的大小确定它在哪个范围内,进而在其中一段再进行二分查找。

存在的问题是,找最大元素不能在完全顺序的条件下找到,比如1,2,3,4就无法确定最大元素,但是不影响结果,因为还要确定target范围,所以在完全顺序的条件下,无论确定那个是最大元素都不影响结果。

 

第二种方法,是递归的做。

In fact, we don’t need to know where the pivot is. Look at the middle element (7). Compare it with the left most (4) and right most element (2). The left most element (4) is less than (7). This gives us valuable information — All elements in the bottom half must be in strictly increasing order. Therefore, if the key we are looking for is between4 and 7, we eliminate the upper half; if not, we eliminate the bottom half.

 

第三种方法是,将第二种方法的递归改为迭代。思路完全相同。

 


 

如果数组中有重复元素,用上面的方法解决,唯一的问题就是当收尾元素相同的时候,比如[1,3,1,1,1]. 因为[1,3,1]不是一个有序的数组。

所以避免这种情况发生,只要让首元素不和最后一个相同就行。在[3,1,1,1]中间寻找target。

posted on 2014-02-13 00:10  longhorn  阅读(146)  评论(0编辑  收藏  举报

导航