21. 旋转数组的最小数字
要求logn的时间复杂度就能想到是用二分法,题目可以得知,nums[begin]>=nums[end],(一开始没想到,还判断了很多次,用了多个if非常混乱)。因为二分归根到底只有两种情况:
- begin = mid
- end = mid
当nums[mid]>nums[end],说明最小值在后半段,前半段可以舍去,即begin=mid+1;
具体看代码更清楚
import java.util.*;
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
int begin = 0;
int end = array.length-1;
while(begin<end){//最大的要给begin,最小的要给end
int mid = (begin+end)/2;
if(array[mid]<array[end]) end = mid;
else if(array[mid]>array[end]) begin = mid+1;
else end--;
}
return array[begin];
}
}
一开始写了很久几个案例没有写清楚,是用array[mid]和array[begin]去比,这样在最后一轮的时候mid=begin,无法判断和end是哪个大,所以应该和array[end]比。
22. 比较版本号
这题好像跟二分没有什么关系,就是用双指针,利用.分割,把每个段转换成数字进行比较
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 比较版本号
* @param version1 string字符串
* @param version2 string字符串
* @return int整型
*/
public int compare (String version1, String version2) {
int l1 = version1.length();
int l2 = version2.length();
int i = 0;
int j = 0;
// write code here
while(i<l1||j<l2){
int num1 = 0;
while(i<l1&&version1.charAt(i)!='.'){
num1 = num1*10 + (version1.charAt(i) - '0');
i++;
}
i++;
int num2 = 0;
while(j<l2&&version2.charAt(j)!='.'){
num2 = num2*10 + (version2.charAt(j) - '0');
j++;
}
j++;
System.out.print(num1);
System.out.print(num2);
if(num1 > num2) return 1;
else if(num1 < num2) return -1;
}
return 0;
}
}