leetcode练习
2014-10-19 22:08
211 查看
//Suppose a sorted array is rotated at some pivot unknown to you beforehand. //(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). //Find the minimum element. //You may assume no duplicate exists in the array. public class One { public int findMin(int[] num) { int i=0; int j=num.length-1; int mid=0; if(num.length==1||num[i]<num[j]) return num[0]; else{ while(i+1!=j){ mid=(i+j)/2; if(num[i]<num[mid]) { i=mid; } if(num[i]>num[mid]){ j=mid; } } return num[j]; } } public static void main(String[] args) { One one=new One(); int[] num={6,7,8,9,1,2,3,4}; int a=one.findMin(num); System.out.println(a); } }
此题目的必然不是暴力遍历,要考虑三种情况:
1)数组里只有一个数的时候,此时谈不上以轴反转,直接输出即可。
2)数组没有以轴翻转,此时直接输出第一个数即可。
3)数组以某一项为轴翻转例:
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2)
思路:翻转之后其实变为两个有序数组,顺序都是从小到大,可以借鉴二分查找的思路。首先定义三个下标,分别为i=0(最左边的下标),j=num.length-1(最右边的下标,因为数组下标从0开始),中间数字的下标mid=(i+j)/2。
接下来就是模拟二分查找的过程:翻转过后,这组数字就变成了两个递增数组,且最小的数在第二个递增数组内,如果num[i]<num[mid],则说明左边的递增数组还未结束,呢最小的必然在右半部分,于是我们抛弃左边的所有数,抛弃方法就是令下标i=mid,j不变,并且重新计算mid;
如果是num[i]>num[mid],说明中间的数字已经在右边的递增数组里了,说明最小的在左半部分,于是我们抛弃右边所有的数,抛弃方法令j=mid,i不变,重新计算mid;
直到最后输出的num[j](因为在此迭代过程中我么不断抛弃的是有序的递增数组,则剩下的两个数就不是递增的,所有num[j]是最小的)。
相关文章推荐
- LeetCode Online Judge 题目C# 练习 - Search Insert Position
- LeetCode Online Judge 题目C# 练习 - String to Integer (atoi)
- Leetcode练习-两个数字相加(Add two numbers)
- LeetCode Online Judge 题目C# 练习 - Subsets II
- 数据结构与算法 LeetCode编程练习--Delete Node in a Linked List
- LeetCode Online Judge 题目C# 练习 - Word Search
- Leetcode__链表练习
- leetCode练习(54)
- leetCode练习(72)
- leetCode练习(73)
- leetCode练习(79)
- LeetCode初级算法练习
- leetCode练习(2)
- 【leetcode】sql练习
- 数据结构与算法-LeetCode练习二分查找应用
- leetCode练习(114)
- leetcode练习 Kth Largest Element in an Array
- LeetCode练习记录2017/12/10
- leetCode练习(116)
- LeetCode编程练习 - Single Number学习心得