LeetCode Find Minimum in Rotated Sorted Array & LeetCode Find Minimum in Rotated Sorted Array II
2015-09-05 22:21
531 查看
Find Minimum in Rotated Sorted Array
题意:有一个排好序的数组,可能旋转,并给出旋转后的序列,不知道旋转点在哪里,求整个数组的最小值解法一:……刚刚看到题目的时候我也是震惊了,貌似遍历一遍就可以了,那么提议当中的旋转点貌似是多余的?……突然感觉到了深深的恶意……
<span style="font-size:18px;">public class Solution { public int findMin(int[] num) { int min = num[0]; int len = num.length; for (int i = 1; i < len; i++) { if (min > num[i]) min = num[i]; } return min; } }</span>
解法二:前一个解法的确是恶意满满,那么就换一个不那么low的解法。
采用二分的想法,不过因为是旋转过的,所以正常二分进行的条件不是arr[mid] > < = target,而是arr[mid]> < arr[left]和arr[right]
arr[mid] > arr[right] / arr[mid] > arr[[left] 表示右半段是上升的,right=mid即可
arr[mid] < arr[left] / arr[mid] < arr[right] 表示左半段是上升的,left=mid即可
<span style="font-size:18px;">public class Solution { public int findMin(int[] num) { int left = 0, right = num.length - 1, mid; if (num[left] <= num[right]) return num[left]; while (left + 1 < right) { mid = (left + right) / 2; if (num[mid] > num[left]) { left = mid; } else { right = mid; } } return num[right]; } public static void main(String[] args) { Solution s = new Solution(); // System.out.println(s.findMin(new int[] { 1, 2 })); System.out.println(s.findMin(new int[] { 3, 4, 5, 1, 2 })); // System.out.println(s.findMin(new int[] { 2, 1 })); System.out.println(s.findMin(new int[] { 2, 3, 4, 5, 1 })); System.out.println(s.findMin(new int[] { 2, 3, 1 })); System.out.println(s.findMin(new int[] { 3, 1, 2 })); } }</span>
Find Minimum in Rotated Sorted Array II
这道题目和上一道题目类似,只是少了一个约束条件:没有duplicate。也就是说,一个包含duplicate的数组进行rotate。解决的方法,我这里参考了一下其他人的解决方法,都是用二分,然后如果arr[mid]==arr[right] right--;
import java.util.*; public class Solution { public int findMin(int[] num) { int left = 0, right = num.length - 1, mid; while (left + 1 < right) { mid = (left + right) / 2; if (num[mid] > num[left]) { left = mid; } else if (num[mid] < num[left]) { right = mid; } else { right--; } } return num[right]; } public static void main(String[] args) { Solution s = new Solution(); // System.out.println(s.findMin(new int[] { 1, 2 })); System.out.println(s.findMin(new int[] { 3, 4, 5, 1, 2 })); // System.out.println(s.findMin(new int[] { 2, 1 })); System.out.println(s.findMin(new int[] { 2, 3, 4, 5, 1 })); System.out.println(s.findMin(new int[] { 2, 3, 1 })); System.out.println(s.findMin(new int[] { 3, 1, 2 })); System.out.println(s.findMin(new int[] { 3, 1, 3 })); System.out.println(s.findMin(new int[] { 1, 1, 1, 1, 1 })); } }
相关文章推荐
- chattr维护文件特殊属性
- 平方和回文数
- js算法:动态规划-多边形游戏
- Visual Studio版本 和 ATL版本对照以及MFC版本对照
- XML解析
- UIday0902:UITableView 1 按iphone的设置项首页简单布局,点击具体项只需要把该项标题值传过去即可。
- Strassen矩阵乘法
- 对数据库一些基本知识的认识
- myeclipse 破解 生成注册码的代码
- Canvas制作排序算法演示动画
- maven本地仓库.m2文件夹路径讲解
- 关于C++中父类指针引用对象在内存中的分布
- 修改Android签名证书keystore作为eclipse默认debug签名证书
- UIPanGestureRecognizer使用小结
- Android回调机制(java)
- Java学习路线图
- IOS 类方法与实例方法的区别
- Adding Users to Passwordfile / Using Passwordfile Authentication (Doc ID 184696.1)
- 翻转吧!方块
- 划分数