📌  相关文章
📜  找到一个数组 B,其中 B 中的至少 arr[i] 个元素不等于 B[i]

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

找到一个数组 B,其中 B 中的至少 arr[i] 个元素不等于 B[i]

给定一个大小为N的数组arr[] ,任务是找到一个大小为N的数组,使得对于数组arr[]的每个第 i元素,输出数组应至少包含arr[i]元素等于输出数组的第 i元素。如果不存在这样的数组,则打印“ Impossible ”。

例子:

方法:给定的问题可以基于以下观察来解决:应该有最多N-arr[i]个元素等于输出数组的第 i元素。请按照以下步骤解决问题:

  • 初始化一个数组,比如大小为N+5res[] ,以存储输出数组。
  • 此外,初始化一个对数组,比如大小为N+5 的 V,其中V[i]存储元素计数等于res[i]和索引i 的对。
  • 使用变量i[1, N]范围内迭代,并在每次迭代中将{N-arr[i], i}对的值赋给V[i]。
  • 按升序对对数组进行排序。
  • 初始化两个变量,比如lr0来遍历数组。
  • 使用变量l迭代范围[0, N-1]并执行以下步骤:  
    • 使用变量r遍历范围[l, N-1]并执行以下操作:
      • 如果V[r + 1].first不等于V[r]。首先,然后打破循环。
    • 如果相同元素的计数,即(r-l+1)不能被V[l].first整除,则打印“ Impossible ”并返回。
    • 初始化一个变量,比如X ,为1以将值分配给数组res[]。
    • 使用变量i迭代范围[l, r]并执行以下步骤:
      • 使用变量j迭代范围[i, i+V[l].first] ,然后在每次迭代中将X分配给res[V[j].second]
      • i增加V[l].firstX增加1
    • l的值更新为r+1
  • 最后,完成以上步骤后,打印数组, res[]。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to find the possible
// output array
void findPossibleArray(int N, int arr[])
{
    pair V[N + 5];
 
    // Stores the output array
    int res[N + 5];
 
    int cnt = 0;
    // Iterate over the range [1, N]
    for (int i = 0; i < N; i++) {
        // Update V[i]
        V[i].first = N - arr[i];
        V[i].second = i;
    }
 
    // Sort the the array
    sort(V, V + N);
 
    // Iterate in the range [1, N]
    for (int l = 0, r = 0; l < N; l = r + 1) {
 
        // Iterate until r is less than N
        for (r = l; r < N - 1; ++r) {
 
            // If V[i+1].first is equal to
            // V[r].first
            if (V[r + 1].first != V[r].first) {
                break;
            }
        }
 
        // If r-l+1 is divisible by V[i].first
        if ((r - l + 1) % V[l].first) {
            cout << "Impossible" << endl;
            return;
        }
 
        // Otherwise,
        for (int i = l; i <= r; i += V[l].first) {
            cnt++;
            // Traverse the array over the range
            // [i, i+V[l].second]
            for (int j = i; j < i + V[l].first && j < N;
                 ++j)
                res[V[j].second] = cnt;
        }
    }
 
    // Print the array res[]
    for (int i = 0; i < N; i++)
        cout << res[i] << ' ';
}
 
// Driver Code
int main()
{
 
    int arr[] = { 4, 4, 4, 4, 4 };
    int N = sizeof(arr) / sizeof(arr[0]);
 
    findPossibleArray(N, arr);
 
    return 0;
}


Java
// Java program for the above approach
import java.util.Arrays;
 
class GFG {
 
    // Function to find the possible
    // output array
    public static void findPossibleArray(int N, int arr[]) {
        int[][] V = new int[N][2];
 
        // Stores the output array
        int[] res = new int[N + 5];
 
        int cnt = 0;
        // Iterate over the range [1, N]
        for (int i = 0; i < N; i++) {
            // Update V[i]
            V[i][0] = N - arr[i];
            V[i][1] = i;
        }
 
        // Sort the the array
        Arrays.sort(V, (a, b) -> a[0] - b[0]);
 
        // Iterate in the range [1, N]
        for (int l = 0, r = 0; l < N; l = r + 1) {
 
            // Iterate until r is less than N
            for (r = l; r < N - 1; ++r) {
 
                // If V[i+1][0] is equal to
                // V[r][0]
                if (V[r + 1][0] != V[r][0]) {
                    break;
                }
            }
 
 
            // If r-l+1 is divisible by V[i][0]
            if (V[l][0] == 0 || ((r - l + 1) % V[l][0]) > 0) {
                System.out.println("Impossible");
                return;
            }
 
            // Otherwise,
            for (int i = l; i <= r; i += V[l][0]) {
                cnt++;
                // Traverse the array over the range
                // [i, i+V[l][1]]
                for (int j = i; j < i + V[l][0] && j < N; ++j)
                    res[V[j][1]] = cnt;
            }
        }
 
        // Print the array res[]
        for (int i : res) {
            if (i > 0) {
                System.out.print(i + " ");
            }
        }
    }
 
    // Driver Code
    public static void main(String args[]) {
 
        int arr[] = { 4, 4, 4, 4, 4 };
        int N = arr.length;
 
        findPossibleArray(N, arr);
    }
}
 
//This code is contributed by saurabh_jaiswal.


Javascript


输出
1 2 3 4 5 

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