データ構造とアルゴリズム: 奇数偶数による配列のソート II

データ構造とアルゴリズム: 奇数偶数による配列のソート II

[[429517]]

簡単なシミュレーション問題、ぜひ挑戦してみてください!

配列を偶数/奇数でソートする II

LeetCode の問題へのリンク: https://leetcode-cn.com/problems/sort-array-by-parity-ii/

非負の整数の配列 A が与えられた場合、A 内の整数の半分は奇数で、残りの半分は偶数です。

A[i] が奇数の場合は i も奇数になり、A[i] が偶数の場合は i も偶数になるように配列をソートします。

上記の条件を満たす任意の配列を答えとして返すことができます。

例:

  • 入力: [4,2,5,7]
  • 出力: [4,5,2,7]
  • 説明: [4,7,2,5]、[2,5,4,7]、[2,7,4,5] も受け入れられます。

アイデア

この質問の直接的なアイデアは、2 層の for ループと、使用された要素を表すために使用される配列である可能性があります。この計算時間は O(n^2) です。

方法1

実際、この問題は非常に簡単な方法で解決でき、時間の計算量は O(n) です。C++ コードは次のとおりです。

  1. クラスソリューション{
  2. 公共
  3. ベクトル< int > sortArrayByParityII(ベクトル< int >& A) {
  4. vector< int > even(A. size () / 2); // オーバーヘッドを節約するために配列サイズを初期化します
  5. ベクトル< int > 奇数(A.size ( ) / 2);
  6. ベクトル< int > 結果(A.size ( ));
  7. 偶数インデックス = 0;
  8. 整数奇数インデックス = 0;
  9. 結果インデックス= 0;
  10. // 配列Aを偶数配列と奇数配列に入れる
  11. ( int i = 0; i < A.size ( ); i++) {
  12. A[i] % 2 == 0の場合、even[evenIndex++] = A[i];
  13. そうでない場合、 odd[oddIndex++] = A[i];
  14. }
  15. // 偶数配列と奇数配列をそれぞれ結果配列に格納します
  16. ( int i = 0; i < evenIndex; i++) {
  17. 結果[resultIndex++] = even[i];
  18. 結果[結果インデックス++] = 奇数[i];
  19. }
  20. 結果を返します
  21. }
  22. };
  • 時間計算量: O(n)
  • 空間計算量: O(n)

方法2

上記のコードでは、2 つの補助配列を構築しており、配列 A は 2 回のトラバースに相当します。補助配列を使用する利点は、アイデアが明確であることです。最適化は、これらの 2 つの補助ツリーを使用しないことです。コードは次のとおりです。

  1. クラスソリューション{
  2. 公共
  3. ベクトル< int > sortArrayByParityII(ベクトル< int >& A) {
  4. ベクトル< int > 結果(A.size ( ));
  5. int evenIndex = 0; // 偶数テーブル
  6. int oddIndex = 1; // 奇数テーブル
  7. ( int i = 0; i < A.size ( ); i++) {
  8. もし(A[i]%2==0)であれば
  9. 結果[evenIndex] = A[i];
  10. 偶数インデックス += 2;
  11. }
  12. それ以外{
  13. 結果[奇数インデックス] = A[i];
  14. 奇数インデックス += 2;
  15. }
  16. }
  17. 結果を返します
  18. }
  19. };
  • 時間計算量 O(n)
  • 空間計算量 O(n)

方法3

もちろん、元の配列を変更することもできますし、結果の配列も必要ありません。

  1. クラスソリューション{
  2. 公共
  3. ベクトル< int > sortArrayByParityII(ベクトル< int >& A) {
  4. 整数奇数インデックス = 1;
  5. ( int i = 0; i < A.size ( ); i += 2) {
  6. if (A[i] % 2 == 1) { // 偶数位置に奇数が発生した
  7. while(A[oddIndex] % 2 != 0) oddIndex += 2; // 奇数の位置にある偶数を見つける
  8. swap(A[i], A[oddIndex]); // 置換
  9. }
  10. }
  11. Aを返します
  12. }
  13. };
  • 時間計算量: O(n)
  • 空間計算量: O(1)

ここでの時間計算量は O(n^2) ではありません。偶数ビットと奇数ビットの両方が 1 回だけ操作され、関係は n/2 * n/2 ではなく、n/2 + n/2 だからです。

その他の言語

ジャワ

  1. // 方法 1
  2. クラスソリューション{
  3. 公共  int [] sortArrayByParityII( int [] 数値) {
  4. // 奇数と偶数をそれぞれnumsに格納します
  5. int len ​​= nums.length;
  6. 偶数インデックス = 0;
  7. 整数奇数インデックス = 0;
  8. int [] even = 新しいint [len / 2];
  9. int [] odd = 新しいint [len / 2];
  10. ( int i = 0; i < len; i++)の場合{
  11. (数値[i] % 2 == 0)の場合{
  12. 偶数[evenIndex++] = nums[i];
  13. }それ以外{
  14. 奇数[oddIndex++] = nums[i];
  15. }
  16. }
  17. // パリティ配列をnumsに格納します
  18. 整数 インデックス= 0;
  19. ( int i = 0; i < even.length; i++) {
  20. nums[インデックス++] = even[i];
  21. nums[インデックス++] = odd[i];
  22. }
  23. 数値を返します
  24. }
  25. }

Python3

  1. #方法2
  2. クラスソリューション:
  3. def sortArrayByParityII(self, nums: List[ int ]) -> List[ int ]:
  4. 結果 = [0]*len(数値)
  5. 偶数インデックス = 0
  6. 奇数インデックス = 1
  7. i が範囲(len(nums))内にある場合:
  8. if nums[i] % 2: #奇数
  9. 結果[奇数インデックス] = 数値[i]
  10. 奇数インデックス += 2
  11. そうでない場合: #偶数
  12. 結果[evenIndex] = nums[i]
  13. 偶数インデックス += 2
  14. 結果を返す
  15.  
  16. #方法3
  17. クラスソリューション:
  18. def sortArrayByParityII(self, nums: List[ int ]) -> List[ int ]:
  19. 奇数インデックス = 1
  20. for i in range(0,len(nums),2): #ステップの長さは2です
  21. if nums[i] % 2: #偶数が奇数に遭遇
  22. while nums[oddIndex] % 2: #奇数桁から偶数を見つける
  23. 奇数インデックス += 2
  24. nums[i], nums[奇数インデックス] = nums[奇数インデックス], nums[i]
  25. 数値を返す

行く

  1. // 方法 1
  2. sortArrayByParityII関数(nums[] int )[] int {
  3. // 奇数と偶数をそれぞれnumsに格納します
  4. 偶数、奇数 := [] int {}, [] int {}
  5. i := 0; i < len(nums); i++ {
  6. (数値[i] % 2 == 0)の場合{
  7. 偶数 = 追加(偶数、数値[i])
  8. }それ以外{
  9. 奇数 = append(奇数, 数値[i])
  10. }
  11. }
  12.  
  13. // パリティ配列をnumsに格納します
  14. 結果:= make([] int , len(nums))
  15. インデックス:= 0
  16. i := 0; i < len(even); i++ {
  17. 結果[インデックス] = even[i];インデックス++;
  18. 結果[インデックス] = odd[i];インデックス++;
  19. }
  20. 結果を返します
  21. }

JavaScript

  1. //方法1
  2. var sortArrayByParityII =関数(数値) {
  3. 定数 n = 数値.長さ;
  4. // 奇数と偶数をそれぞれnumsに格納します
  5. 偶数インデックス = 0、奇数インデックス = 0 とします。
  6. // オーバーヘッドを節約するために配列サイズを初期化します
  7. const even = 新しい配列(Math.floor(n/2));
  8. const odd = 新しい配列(Math.floor(n/2));
  9. // 配列Aを偶数配列と奇数配列に入れる
  10. ( i = 0; i < n; i++ とします){
  11. if(nums[i] % 2 === 0) even[evenIndex++] = nums[i];
  12. そうでない場合はodd[oddIndex++] = nums[i];
  13. }
  14. // パリティ配列をnumsに格納します
  15. インデックスを 0 にします。
  16. ( i = 0 とします; i < even.length; i++){
  17. nums[インデックス++] = even[i];
  18. nums[インデックス++] = odd[i];
  19. }
  20. 数値を返します
  21. };
  22.  
  23. //方法2
  24. var sortArrayByParityII =関数(数値) {
  25. 定数 n = 数値.長さ;
  26. const 結果 = 新しい配列(n);
  27. // 偶数と奇数の添え字
  28. 偶数インデックス = 0、奇数インデックス = 1 とします。
  29. ( i = 0; i < n; i++ とします){
  30. if(nums[i] % 2 === 0) {
  31. 結果[evenIndex] = nums[i];
  32. 偶数インデックス += 2;
  33. }それ以外{
  34. 結果[奇数インデックス] = nums[i];
  35. 奇数インデックス += 2;
  36. }
  37. }
  38. 結果を返します
  39. };
  40.  
  41. //方法3
  42. var sortArrayByParityII =関数(数値) {
  43. 奇数インデックスを 1 とします。
  44. ( i = 0 とします; i < nums.length; i += 2){
  45. if(nums[i] % 2 === 1){ // 偶数位置に奇数がある
  46. while(nums[oddIndex] % 2 !== 0) oddIndex += 2; // 奇数の位置にある偶数を見つける
  47. [nums[oddIndex], nums[i]] = [nums[i], nums[oddIndex]]; // 分解代入交換
  48. }
  49. }
  50. 数値を返します
  51. };

<<:  MIT、新たな3Dプリント材料の発見を加速する新たなAIツールを開発

>>:  AIの偏見に対処するための重要なステップ

ブログ    
ブログ    

推薦する

...

React と DOM - ノード削除アルゴリズム

[[378076]]これは、React DOM 操作を詳細に説明した最初の記事です。記事の内容はコミ...

...

Google Brain エンジニアの講演: TensorFlow とディープラーニング

この記事は、Google Brain エンジニアの Zhou Yuefeng 氏が QCon Sha...

OpenAI CEO サム・アルトマン: AI革命が到来、新たなシステムが必要

サム・アルトマンのブログ記事全文は次のとおりです。 OpenAI での私の仕事は、ほとんどの人が認識...

人工知能による大量失業の懸念は根拠がない

[[256558]] AIが大量失業を引き起こすという懸念は根拠がない世界的な研究機関である羅漢研究...

...

...

Nvidia に挑戦する Groq の起源は何ですか?新しいAIチップLPUの簡単な紹介

今日の人工知能分野では、「GPUがあれば十分」というのが徐々にコンセンサスになってきています。十分な...

人工知能を使ったチャットボットの構築方法

今日、世界は、パーソナライズされたエクスペリエンスを提供しながら、人間が重要な決定を下したり、重要な...

75歳のヒントン氏が再び警告:AIが人間を支配するかもしれない!

10月9日、ヒントン氏は「60 Minutes」のインタビューを受け、人工知能が人間を支配するかも...

脳のようなデバイスを使用して神経信号を効率的に処理し、新しい脳コンピューターインターフェースを構築する

最近、清華大学マイクロナノエレクトロニクス学部および未来チップ技術先進イノベーションセンターのQia...

...