サブアレイを逆にすることでXNUMXつのアレイを等しくするLeetcodeSolution


難易度 簡単に
よく聞かれる Facebook
配列

サブ配列を逆にしてXNUMXつの配列を等しくするという問題LeetcodeSolutionは、XNUMXつの配列を提供します。 アレイ。 それらのXNUMXつはターゲット配列で、もうXNUMXつは入力配列です。 入力配列を使用して、ターゲット配列を作成する必要があります。 入力配列内の任意のサブ配列を逆にすることができます。 ただし、入力配列の要素を変更することはできません。 操作を実行する方法を見つける必要はありません。 可能であればtrueを返し、そうでない場合はfalseを返します。 したがって、いつものように、ソリューションを深く掘り下げる前に、いくつかの例を見てみましょう。

サブアレイを逆にすることでXNUMXつのアレイを等しくするLeetcodeSolution

target = [1,2,3,4], arr = [2,4,1,3]
true

説明:最初のサブ配列をインデックス0から2に反転し、次にサブ配列を1から2に反転できます。最後に、インデックス2を3に反転します。このようにして、ターゲット配列を作成できます。 。 上の画像を見るとよくわかります。

サブアレイを逆にすることでXNUMXつのアレイを等しくするためのアプローチLeetcodeSolution

この問題は、カウント方法を使用して簡単に解決できます。 カウント方法は、標準的なアルゴリズムの一部です。 カウントソートや他の多くの質問で使用されます。 したがって、ここでは、ターゲット配列からの要素の数を保持します。 次に、入力配列の要素をトラバースします。 要素に遭遇すると、頻度またはカウント配列からそのカウントをデクリメントします。 この操作中に何らかの理由でインデックスが負の値を保持している場合、falseを返します。

頻度配列の負のカウントは、入力配列の要素のカウントが大きいことを示します。 しかし、これを行うとどのように問題が解決しますか? 観察結果がわかれば、答えは簡単です。 サブ配列のいくつかの反転を実行しようとすると。 入力配列の任意の要素を任意の場所の任意の場所に配置できることが簡単にわかります。 したがって、このルールを使用して、ターゲット配列の要素が入力配列の要素と同じであるかどうかを確認する必要があります。

サブ配列を逆にしてXNUMXつの配列を等しくするためのコードLeetcodeSolution

C ++コード

#include <bits/stdc++.h>
using namespace std;

bool canBeEqual(vector<int>& target, vector<int>& arr) {
    vector<int> cnt(1001, 0);
    for(int i=0;i<target.size();i++)
        ++cnt[target[i]];
    for (int i=0;i<arr.size();i++) {
        if (--cnt[arr[i]] < 0) {
            return false;
        }
    }
    return true;
}

int main(){
    vector<int> target = {1, 2, 3, 4};
    vector<int> arr = {2, 3, 1, 4};
    cout<<(canBeEqual(target, arr) ? "true" : "false");
}
true

Javaコード

import java.util.*;
import java.lang.*;
import java.io.*;

class Main
{
  public static boolean canBeEqual(int[] target, int[] arr) {
        int[] cnt = new int[1001];
        for(int i=0;i<target.length;i++)
            ++cnt[target[i]];
        for (int i=0;i<arr.length;i++) {
            if (--cnt[arr[i]] < 0) {
                return false;
            }
        }
        return true;
    }
    
  public static void main (String[] args) throws java.lang.Exception
  {
    int[] target = {1, 2, 3, 4};
      int[] arr = {2, 3, 1, 4};
      System.out.print(canBeEqual(target, arr) ? "true" : "false");
  }
}
true

複雑さの分析

時間の複雑さ

オン)、 配列のすべての要素をトラバースするためです。

スペースの複雑さ

O(1)、 一定サイズの周波数またはカウント配列を使用したためです。