No.8 旋轉數組的最小數字 翻轉的數組,總有一邊是有序的 eg[2,3,4,5,6,1];采用二分查找,注意{1,0,1,1,1,1,1},則不能縮小問題規模,需要依次遍歷
//特例{1,0,1,1,1,1,1} public int minOrder(int[] array, int left, int right){ int min = array[left]; for(int i = left + 1; i <= right; i++){ min = Math.min(min, array[i]); } return min; } public int minNumberInRotateArray(int [] array) { int len = array.length; if(len == 0) return 0; int low = 0, high = len - 1, mid; //結束條件:若該段數組是有序的,則返回第一個值 while(array[low] >= array[high]){ //防止大數相加溢出 mid = low + (high - low) / 2; if(mid == low) return Math.min(array[low], array[high]); if(array[low] == array[mid] && array[mid] == array[high]) return minOrder(array, low, high); if(array[low] > array[mid]){ high = mid; }else{ low = mid; } } return array[low]; }No.9 斐波那契數列 思路:遞歸(簡潔,耗時)、循環(高效)
public int Fibonacci(int n){ if(n == 0 || n == 1) return n; return Fibonacci(n - 1) + Fibonacci(n - 2); } public int Fibonacci(int n){ if(n == 0 || n == 1) return n; int low = 0, high = 1, sum = 1; for(int i = 2; i < n; i++){ sum = low + high; low = high; high = sum; } return sum; }No.10 跳臺階(類似于)
這里寫代碼片新聞熱點
疑難解答