求一個排序陣列中絕對值最小的數
阿新 • • 發佈:2019-01-29
題意描述:給定一個已排好序的陣列,求陣列中絕對值最小的元素
解題思路一:直接遍歷,時間複雜度為O(n),求得陣列中絕對值最小的元素
解題思路二:直接遍歷求最小的時間複雜度為O(n),並且也沒有用到題目中給定的條件---已排序的陣列。因此考慮到二分查詢,最小的數應該是最大的負數與最小非負數之間絕對值較小的那個數int getMinAbs(int[] num){ //當陣列只有一個元素的情況直接返回 if(num.length == 1) return num[0]; //當陣列非負時直接返回num[0],當陣列非正時直接返回num[num.length-1] if(num[0] >= 0) return num[0]; else if(num[num.length-1] <= 0) return num[num.length-1]; int min = Math.abs(num[0]); for(int i=1; i<num.length; i++) min = Math.min(min, Math.abs(num[i])); return min; }
int getMinAbs(int[] num) { //當陣列只有一個元素的情況直接返回 if(num.length == 1) return num[0]; //當陣列非負時直接返回num[0],當陣列非正時直接返回num[num.length-1] if(num[0] >= 0) return num[0]; else if(num[num.length-1] <= 0) return num[num.length-1]; //當陣列有正有負時,返回最大的負數與最小的非負數中較小的那一個 int low = 0, high = num.length-1, mid = (low + high)/2; while(low < high){ if(num[mid] < 0) low = mid + 1; else if(num[mid] > 0){ if(num[mid] * num[mid-1] < 0) return Math.min(Math.abs(num[mid-1]), num[mid]); high = mid - 1; }else return num[mid]; mid = (low + high) / 2; } return 0; }