1. 程式人生 > >求一個排序陣列中絕對值最小的數

求一個排序陣列中絕對值最小的數

題意描述:給定一個已排好序的陣列,求陣列中絕對值最小的元素

解題思路一:直接遍歷,時間複雜度為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;
}
解題思路二:直接遍歷求最小的時間複雜度為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 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;
}