📌  相关文章
📜  从所有元素中减去最大值 K 次后找到最终数组

📅  最后修改于: 2022-05-13 01:56:10.324000             🧑  作者: Mango

从所有元素中减去最大值 K 次后找到最终数组

给定一个包含N个整数的数组arr[]和一个整数K,任务是对该数组执行以下操作K次。操作如下:

  • 从数组中找到最大元素(比如M )。
  • 现在用Ma i替换每个元素其中 1 ≤ i ≤ N。

例子:

Naive Approach:简单的方法是将上述操作执行K次。每次在数组中找到最大元素,然后更新与最大值不同的所有元素。

时间复杂度: O(N*K)。
辅助空间: O(1)。

有效方法:此问题的有效解决方案基于以下观察:

按照以下步骤实施观察:

  • 取一个变量max并存储arr的最大元素。
  • 如果K是奇数
    • 遍历数组并从最大元素中减去每个元素。
  • 别的
    • 遍历arr并从最大元素中减去每个元素,然后
      将最大元素存储在max1变量中。
    • 再次遍历arr并从最大元素中减去每个元素。
  • 打印最终数组。

下面是上述方法的实现:

C++
// C++ code for the approach
  
#include 
using namespace std;
  
// Function for converting the array
void find(int n, int k, int arr[])
{
    // Find the maximum element in array
    int max = INT_MIN;
    for (int i = 0; i < n; i++) {
  
        if (arr[i] > max) {
            max = arr[i];
        }
    }
  
    // If k is odd
    if (k % 2 != 0) {
        for (int i = 0; i < n; i++) {
            cout << max - arr[i] << " ";
        }
    }
    // If k is even
    else {
  
        // Subtract the max from every
        // element of array and store
        // the next maximum element in max1
        int max1 = INT_MIN;
        for (int i = 0; i < n; i++) {
            arr[i] = max - arr[i];
            if (arr[i] > max1) {
                max1 = arr[i];
            }
        }
  
        // Print the output
        for (int i = 0; i < n; i++) {
            cout << max1 - arr[i] << " ";
        }
    }
}
  
// Driver code
int main()
{
    int N = 6, K = 3;
    int arr[] = { 5, 38, 4, 96, 103, 41 };
  
    // Function call
    find(N, K, arr);
    return 0;
}


输出
98 65 99 7 0 62 

时间复杂度: O(N)
辅助空间: O(1)