定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小。 给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可。
public class Solution { public static int findPartMin(int[] data,int lo,int hi){ while(lo<=hi){ int mid = lo+(hi-lo)/2; if(data[mid]<data[mid-1]&&data[mid]<data[mid+1]) return mid; else if(data[mid]>data[mid-1]) hi = mid-1; else if(data[mid]>data[mid+1]) lo = mid+1; } return -1; } public int getLessIndex(int[] arr) { if(arr.length==1) return 0; else if(arr.length>1){ if(arr[0]<arr[1]) return 0; else if(arr[arr.length-1]<arr[arr.length-2]) return arr.length-1; else return findPartMin(arr,1,arr.length-2); }else return -1; } }
对于一个有序数组arr,再给定一个整数num,请在arr中找到num这个数出现的最左边的位置。
给定一个数组arr及它的大小n,同时给定num。请返回所求位置。若该元素在数组中未出现,请返回-1。
测试样例:
[1,2,3,3,4],5,3
返回:2
import java.util.*; public class LeftMostAppearance { public int findPos(int[] arr, int n, int num) { // write code here int left = 0,right = n-1; int pos = -1; while(left<=right){ int mid = left+(right-left)/2; if(arr[mid]>num) right = mid-1; else if(arr[mid]<num) left = mid+1; else{ pos = mid; right = mid-1; } } return pos; } }
有一个有序数组arr,其中不含有重复元素,请找到满足arr[i]==i条件的最左的位置。如果所有位置上的数都不满足条件,返回-1。
给定有序数组arr及它的大小n,请返回所求值。
测试样例:
[-1,0,2,3],4
返回:2
import java.util.*; public class Find { public int findPos(int[] arr, int n) { // write code here int left = 0,right = n-1; while(left<=right){ int mid = left+(right-left)/2; if(arr[left]==left) return left; if(arr[mid]>mid) right = mid-1; else if(arr[mid]<mid) left = mid+1; else return mid; } return -1; } }
如果更快的求一个整数k的n次方。如果两个整数相乘并得到结果的时间复杂度为O(1),得到整数k的N次方的过程请实现时间复杂度为O(logN)的方法。
给定k和n,请返回k的n次方,为了防止溢出,请返回结果Mod 1000000007的值。
测试样例:
2,3
返回:8
import java.util.*; public class QuickPower { public int getPower(int k, int N) { // write code here String bin = Integer.toBinaryString(N); //System.out.println(bin+" "+bin.length()); long[] temp = new long[bin.length()]; temp[0] = k; for(int i = 1;i < bin.length(); i++){ temp[i] = ((temp[i-1]*temp[i-1])%1000000007); //System.out.println(temp[i]+" "+i); } long result = 1; for(int i = bin.length()-1;i >= 0; i--) if(bin.charAt(i)=='1'){ result = result*temp[bin.length()-1-i]; result = result%1000000007; } //System.out.println((int)result+" "+Integer.MAX_VALUE); return (int)result; } }
更简洁的代码:
import java.util.*; public class QuickPower { public int getPower(int k, int N) { // write code here if(k==0){ return 0; } if(k==1){ return 1; } if(N==0){ return 1; } long modNum=1000000007; long res=1; long tmp=k; for(;N>0;N>>=1){ if((N&1)!=0){ res*=tmp; } tmp=(tmp*tmp)%modNum; res=res%modNum; } return (int)res; } }
题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { int left = 0,right = array.length-1; int mid = left; while(array[left]>=array[right]){ if(right-left==1){ mid = right; break; } mid = (left+right)/2; if(array[left]==array[right]&&array[mid]==array[left]) return search(array,left,right); if(array[mid]>=array[left]) left = mid; else if(array[mid]<=array[right]) right = mid; } return array[mid]; } int search(int[] array,int left,int right){ int result = array[left]; for(int i = left+1; i<=right; i++) if(result>array[i]) result = array[i]; return result; } }