小红想在
次操作之后,数组的最大值尽可能小。请你返回这个最大值。
public int minMax (ArrayList<Integer> a, int k, int x) {
// write code here
//创建最大优先队列(大在头)
PriorityQueue<Integer> queue1 = new PriorityQueue<>( (o1,o2) -> o2-o1);
//添加元素进入优先队列
for (int i:a){
queue1.add(i);
}
//k次最大值-x
for (int j=0;j<k;j++){
//弹出最大值-x,在插入
int max = queue1.poll();
queue1.add(max-x);
}
return queue1.poll();
}
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @param k int整型 * @param x int整型 * @return int整型 */ int minMax(vector<int>& a, int k, int x) { priority_queue<int> q; for(auto i:a){ q.push(i); } while(k--){ int todo = q.top(); q.pop(); todo = todo - x; q.push(todo); } return q.top(); } };
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @param k int整型 * @param x int整型 * @return int整型 */ bool check(vector<int>& a, int mid, int k, int x) { int cnt = 0; for(int i = 0; i < a.size(); ++i) { if(a[i] > mid) { cnt += (a[i] - mid)/x + ((a[i]-mid)%x > 0 ? 1:0); // 如果(a[i] - mid)%x大于0,则表明没有减干净,有剩余,而题目的要求是要所有的值小于mid,那么就得多来一个x,把这个剩余值干掉 } if(cnt > k) return true; } return false; } int minMax(vector<int>& a, int k, int x) { // write code here sort(a.begin(), a.end()); int l = -k*x, r = a[a.size()-1]; while(l < r) { int mid = (r - l)/2 + l; if(check(a, mid, k, x)) l = mid + 1; else r = mid; } return l; } };
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型ArrayList * @param k int整型 * @param x int整型 * @return int整型 */ public int minMax (ArrayList<Integer> a, int k, int x) { // write code here PriorityQueue<Integer> q = new PriorityQueue<>((o1, o2) -> o2 - o1); for(int i = 0; i < a.size(); i++) { q.add(a.get(i)); } while(k -- > 0) { int top = q.poll(); top -= x; q.add(top); } return q.peek(); } }
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class Main2 { static InputStreamReader in=new InputStreamReader(System.in); static BufferedReader br=new BufferedReader(in); static final int MAXN = 100100; static long n, k, x; static long[] a = new long[MAXN]; public static void main(String[] args) throws IOException { String[] nkx=br.readLine().split(" "); n = Long.parseLong(nkx[0]); k = Long.parseLong(nkx[1]); x = Long.parseLong(nkx[2]); String[] arrStr=br.readLine().split(" "); for (int i = 1; i <= n; i++) { a[i] = Long.parseLong(arrStr[i-1]); } long l = Long.MIN_VALUE, r = Long.MAX_VALUE, ans = 0; // l-----r while (r >= l) { long mid = (l + r) / 2; if (check(mid)) { //缩小范围 r = mid - 1; ans = mid; } else { //扩大范围 l = mid + 1; } } System.out.println(ans); } static boolean check(long ma) { long z = 0; for (int i = 1; i <= n; i++) { if (a[i] > ma) { z += (a[i] - ma) / x; if ((a[i] - ma) % x > 0) { z++; } } if (z > k) { return false; } } return k >= z; } }
这题是故意考察二分的,二分的时间复杂度是N,如果用优先队列的话时间复杂度为K*lg(N),这题肯定是K设置的比N大的多,所以你要是用大顶堆会超时
class Solution: def check(self,mid, a, k ,x): count = 0 for num in a: if num > mid: count += (num - mid + x - 1) // x return count <= k def minMax(self , a: List[int], k: int, x: int) -> int: left = min(a)-k*x right = max(a) while left < right: mid = (left + right) // 2 if self.check(mid, a, k,x): right = mid else: left = mid + 1 return left
package main import "sort" func minMax( a []int , k int , x int ) int { // write code here if len(a) == 1{ return a[0] - k * x; } sort.Ints(a); idx := len(a) - 1 for(k > 0 && idx > 0 ){ a[idx] -= x k-- if k > 0 && a[idx] < a[idx - 1]{ a = trikyBubble(a[:idx], a[idx]) //效率比sort好一点 不然只能12/20 } } if a[idx] < a[idx - 1]{ return a[idx - 1] } return a[idx] } func trikyBubble(nums []int, num int) []int{ x := sort.SearchInts(nums, num) tmp := make([]int, 0) tmp = append(tmp,nums[:x]...) tmp = append(tmp,num) tmp = append(tmp,nums[x:]...) return tmp }
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @param k int整型 * @param x int整型 * @return int整型 */ int minMax(vector<int>& a, int k, int x) { priority_queue<int> pq(a.begin(),a.end()); while(k --) { int t = pq.top(); pq.pop(); pq.push(t - x); } return pq.top(); } };
public static int minMax(ArrayList<Integer> a, int k, int x) { Integer[] array; //如果a.size 大于k, 那就从前k个数里面下手 if(a.size()>k){ PriorityQueue<Integer> minheap = new PriorityQueue<>(k); Iterator<Integer> it = a.iterator(); //首先提前把k个元素放进最小堆 for (int i = 0; i < k; i++) { it.next(); minheap.add(a.get(i)); } while (it.hasNext()) { int num = it.next(); if (num > minheap.peek()) { minheap.add(num); minheap.poll(); } } array= minheap.toArray(new Integer[0]); }else{ //如果a.size小于k array = a.toArray(new Integer[0]); } Arrays.sort(array); while (k > 0) { array[array.length - 1] -= x; Arrays.sort(array); k--; } return array[array.length - 1]; // write code here }
import java.util.*; public class Solution { public int minMax (ArrayList<Integer> a, int k, int x) { //创建优先级队列,并使用Collections.reverseOrder()构造一个最大优先队列 PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder()); //调用addAll方法直接传入ArrayList集合 pq.addAll(a); return minMaxHelp(pq,k,x); } public int minMaxHelp(PriorityQueue<Integer> pq , int k ,int x) { //偷窥当前队列中的最大优先级数值 int peek = pq.peek(); int peek1 = peek - x; k--; //移除最大优先级数值 pq.remove(peek); //添加操作后的数值 pq.add(peek1); //操作次数为0就返回队列中最大优先级数值,否则就递归调用 if (k == 0) return pq.peek(); return minMaxHelp(pq,k,x); } }
class Solution: def minMax(self , a: List[int], k: int, x: int) -> int: # write code here if k==0: return max(a) res=10001 i,max_num=0,-1 for now_i,a_num in enumerate(a): if a_num>max_num: i=now_i max_num=a_num a[i]=a[i]-x #tmp=a[:i]+[a[i]-x]+a[i+1:] #print(tmp) res=min(self.minMax(a,k-1,x),res) return ressort模拟也会超时:(14/20)
class Solution: def minMax(self , a: List[int], k: int, x: int) -> int: # write code here tmp=a while(k>0): a.sort() a[-1]=a[-1]-x k-=1 #print(tmp) return max(tmp)
import heapq class Solution: def minMax(self , a: List[int], k: int, x: int) -> int: # write code here tmp=[] for num in a: heapq.heappush(tmp, -num) while(k>0): min_num=heapq.heappop(tmp) heapq.heappush(tmp, min_num+x) k-=1 #print(tmp) return -heapq.heappop(tmp)
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型vector * @param k int整型 * @param x int整型 * @return int整型 */ int minMax(vector<int> &a, int k, int x) { // write code here priority_queue<int> pq; for (int i : a) { pq.emplace(i); } for (int i = 0; i < k; i++) { int mx = pq.top() - x; pq.pop(); pq.emplace(mx); } return pq.top(); } };
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param a int整型ArrayList * @param k int整型 * @param x int整型 * @return int整型 */ public int minMax (ArrayList<Integer> a, int k, int x) { // write code here PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>(){ @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } }); for (Integer num : a) { queue.offer(num); } for (int i = 0; i < k; i++) { Integer num1 = queue.poll(); queue.offer(num1-x); } return queue.peek(); } }