【问题标题】:Javascript: finding minimum sum after k operationsJavascript:在 k 次操作后找到最小总和
【发布时间】:2021-01-16 07:59:27
【问题描述】:

一个数组被操作 k 次,每次最大值除以 2 并向上取整。在这些 k 操作之后,我需要找到它的最小总和。 k 和数组 num > 1 中的所有数字。方法 minSum 接收一个名为 num 的数组和一个整数 k。对我来说时间复杂度非常差的粗暴 Python 代码是:

function minSum(arr, k) {
    // Write your code here
let sum = 0; 
    while(k !==0){

       
        let max = Math.max(...arr)
        let index = arr.indexOf(max);
         
        max = Math.ceil(max/2);
        arr[index] = max;
        
        k--;
    }
    sum =  arr.reduce((a, b) => a + b, 0);
        console.log(sum);
    return sum;
}

与 python 相关的类似问题在这里。 More efficient method of finding minimum sum after k operations

但与 Javascript 无关。

【问题讨论】:

  • 您应该选择一种,Java 或 JavaScript,两者是完全不同的语言。然后你应该专注于这个问题,你不能做你需要做的事情?
  • 使用优先队列。最大值将在顶部。更改。 PriorityQueue 将自行重新排列。重复此 k 次。这只需要 n log n + k log n。最后你可以总结。 PriorityQueue java
  • 最低金额是什么意思?
  • 我添加了一个例子。
  • 这是一个javascript问题。 Java 与 java 没有关系(或者正如这里的一个人所说,就像“痛苦”与“绘画”的关系一样多)。

标签: javascript algorithm time-complexity space-complexity


【解决方案1】:

以下是步骤(根据您在更改为 JavaScript 之前的第一个需求使用 Java):

    1. 使用最大堆(PriorityQueue 以相反的顺序),因此最大值将位于顶部。
    1. 对于 k 次迭代:获取顶部的元素 (poll()),执行操作,然后将其再次添加到最大堆中。
    1. 最后,只是求和。
    public static int minSumJava_using_pqueue(int arr[], int k)
    {
        PriorityQueue<Integer> pq = new PriorityQueue<>(10, Collections.reverseOrder());

        for (int val : arr) {
            pq.add(val);
        }

        int new_val;
        for(int i =0; i<k; i++)
        {
            new_val = pq.poll();
            new_val = (int) Math.ceil(new_val/2.0);
            pq.add(new_val);
        }

        int sum = 0;
        for (Integer val: pq) {
            sum += val;
        }
        
        return sum;
    }

查看源代码:

    public static void main(String[] args)
    {
        int k = 4;
        int arr[] = {10,20,7};
        int result = minSumJava_using_pqueue(arr, k);
        System.out.println("min sum = "+ result);
    }

结果确实和你的例子一样:

min sum = 14

注意:你可以用 JavaScript 或任何其他编程语言做同样的事情

【讨论】:

  • 对 javascript @ibra 的任何建议
  • 我想,一开始你提到Java!!,无论如何,算法是完全一样的javascript看PriorityQueue in JavaScript
【解决方案2】:
const minSum = (arr, k) => {
  let newArr = arr
  while (k--) {
    let max;
    let newValue;
    let replacingIndex;
    max = Math.max.apply(Math, newArr);
    newValue = Math.ceil(max / 2);
    replacingIndex = newArr.findIndex((value) => value === max);
    newArr[replacingIndex] = newValue;
  }
  return newArr.reduce((a, b) => {a + b})
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 2021-01-06
    相关资源
    最近更新 更多