首页 > 试题广场 >

小红的数组操作

[编程题]小红的数组操作
  • 热度指数:3639 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小红拿到了一个数组 a,每次操作小红可以选择数组中的任意一个数减去 x,小红一共能进行 k 次。
小红想在 k 次操作之后,数组的最大值尽可能小。请你返回这个最大值。
示例1

输入

[7,2,1],3,2

输出

2

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();
    } 

发表于 2022-08-01 22:23:55 回复(2)
//网易第三题,可惜笔试的时候傻了 
  public int minMax(ArrayList<Integer> arr, int k, int x) {
        Collections.sort(arr);
        int right = arr.get(arr.size() - 1);
        int left = arr.get(0) - k * x;
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (countN(arr, x, k, mid) != -1) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return right;
    }

    public static int countN(ArrayList<Integer> arr, int x, int k, int key) {
//        某位置为最大值需要的k
        int cnt = 0;
        for (int i = arr.size() - 1; i >= 0; i--) {
            if (arr.get(i) > key) {
                //需要消耗的x
                cnt += (arr.get(i) - key) / x + ((arr.get(i) - key) % x > 0 ? 1 : 0);
            }
            if (cnt > k) {
                return -1;
            }
        }
        return cnt;
    }
发表于 2022-09-04 18:16:00 回复(2)
用C++的优先队列,极简版代码:
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();
    }
};
	


编辑于 2022-07-22 16:52:36 回复(0)

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;
    }
};
编辑于 2022-11-01 20:05:19 回复(0)
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();
    }
}

发表于 2022-08-14 16:08:59 回复(0)
#python 构建最大堆
import heapq
classSolution:
    defminMax(self, a: List[int], k: int, x: int) -> int:
        # write code here
        heap =[]
        foridx, item inenumerate(a):
            heapq.heappush(heap, (-item, idx))
        whilek > 0:
            e =heapq.heappop(heap)
            heapq.heappush(heap, (e[0] +x, e[1]))
            k -=1
        return-heapq.heappop(heap)[0]
发表于 2022-07-23 14:18:21 回复(0)
二分法
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




发表于 2023-03-24 19:18:39 回复(0)
运用heapq的python简单代码
import heapq
class Solution:
    def minMax(self , a: List[int], k: int, x: int) -> int:
        l=a
        heapq._heapify_max(l)
        for i in range(k):
            temp=heapq._heappop_max(l)
            temp=temp-x
            l.append(temp)
            heapq._siftdown_max(l, 0,len(l)-1)
        return heapq.nlargest(1,l)[0]

发表于 2022-10-20 18:44:08 回复(0)
18/20 超时了= = 思路清奇只能说
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
}


发表于 2022-09-07 02:11:31 回复(0)
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();
    }
};

发表于 2022-08-21 00:14:03 回复(0)
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
        if(a.size()==0||a==null){
            return -1;
        }
    //循环k次
        while(k>0){
            int index=findMax(a); //找到最大值
            int res=a.get(index)-x;
            a.set(index,res);
            k--;
        }
        int index=findMax(a);
        return a.get(index);
    }

    //类似于快排,找到最大值,返回最大值的索引
    public int findMax(ArrayList<Integer> num){
        if(num.size()==0||num==null){
            return -1;
        }
        int index=0;
        int temp=num.get(0);
        for(int i=0;i<num.size()-1;i++){
            if(temp>num.get(i+1)){
                continue;
            }else{
                temp=num.get(i+1);
                index=i+1;
            }
        }
        return index;
    }
}
发表于 2022-08-20 09:47:46 回复(0)
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 }
发表于 2022-08-17 17:11:07 回复(0)
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);
    }
}

编辑于 2022-08-11 23:29:56 回复(0)
造轮子dfs或者模拟直接超时(2/20):
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 res
sort模拟也会超时:(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)


直接用包算了:
ac
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)



编辑于 2022-08-10 16:01:32 回复(0)
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();
    }
};

发表于 2022-08-01 15:14:09 回复(0)
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();
    }
}

发表于 2022-06-24 19:58:15 回复(0)

问题信息

上传者:小小
难度:
16条回答 8454浏览

热门推荐

通过挑战的用户