美食網(wǎng)站建設(shè)多少錢營(yíng)銷型網(wǎng)站分為哪幾種
在數(shù)組nums中找到p個(gè)數(shù)對(duì),使差值絕對(duì)值的和最小。
思路:
最小差值應(yīng)該是數(shù)值相近的一對(duì)數(shù)之間產(chǎn)生,讓數(shù)值相近的數(shù)字盡量靠在一起方便計(jì)算,所以需要排序。
這里不去直接考慮一對(duì)對(duì)的數(shù)字,而是直接考慮差值的取值。
用binary search搜索一個(gè)差值。
左邊界是0,右邊界就是nums中的最大值 - 最小值(nums排序后最右邊數(shù)字 - 最左邊數(shù)字)。
確定mid = 差值,那么一對(duì)數(shù)字的差的絕對(duì)值如果 <= 這個(gè)差值,就說明滿足,
遍歷數(shù)組nums, 計(jì)算滿足 <= 差值的數(shù)字有多少對(duì),記為cnt對(duì),
如果cnt >= p, 說明差值在mid內(nèi)的數(shù)字對(duì)能達(dá)到p個(gè),可以進(jìn)一步縮小差值,right= mid.
反之需要left = mid+1.
class Solution {int n = 0;public int minimizeMax(int[] nums, int p) {n = nums.length;Arrays.sort(nums);int left = 0;int right = nums[n-1] - nums[0];while(left < right) {int mid = left + (right - left) / 2;if(canMakePairs(mid, nums, p)) {right = mid;} else {left = mid + 1;}}return left;}boolean canMakePairs(int mid, int[] nums, int p) {int cnt = 0;for(int i = 0; i < n-1 && cnt < p;i++){ //在這里限制cnt<p,因?yàn)閜可以是0if(nums[i+1] - nums[i] <= mid) {cnt ++;i ++; //加上for里面的i++,相當(dāng)于i向右移動(dòng)2位}}return cnt >= p;}
}