ブラシの質問のウェブサイト:Leetcode
難易度:簡単
言語:Python
計画:簡単->から中->から難しい。
1.977個の順序付けられた配列の正方形
1.1タイトルの説明:
非降順でソートされた整数の配列が与えられた場合、各数値の新しい平方の配列をnums
返し、非降順でもソートするように求められます。
- 例1
输入:nums = [-4,-1,0,3,10]
输出:[0,1,9,16,100]
解释:平方后,数组变为 [16,1,0,9,100]排序后,数组变为 [0,1,9,16,100]
- 例2
输入:nums = [-7,-3,2,3,11]
输出:[4,9,9,49,121]
1.2思考と分析
この質問の最初の考えは、最初に配列全体の数値を2乗してから、並べ替えを実行することです。ご想像のとおり、時間計算量はO(nlogn)O(n logn)です。O (n l o g n )、確かに最良のアイデアではありません。
この質問に戻ると、これはダブルポインタと呼ばれ、ダブルポインタを使用する必要があります。ダブルポインタとは何ですか。
ダブルポインタ:目的は、問題を解決するために、同じ方向(高速ポインターと低速ポインター)または反対方向(衝突ポインター)の2つのポインターを使用して、オブジェクトをトラバースするプロセスでスキャンすることです。
- 1)高速ポインターと低速ポインター:2つのポインターが同じ方向から配列をトラバースし始めます。これらはそれぞれ高速ポインター(高速)と低速ポインター(低速)として定義され、2つのポインターの値が次のようになるまで異なる戦略で移動します同等。
- 2)衝突するポインタ:名前が示すように、順序付けられた配列の両端から中央まで配列をトラバースするように設計されています。(順序付けられた配列に適用できます。たとえば、以前に紹介した配列の二分探索と検索挿入位置は、衝突ポインターを使用します)
全体として、順序付けられた配列に遭遇した場合、問題を解決するために最初にダブルポインターを考える必要があります.2つのポインタートラバーサルは、スペースの複雑さと時間の複雑さを軽減します。
詳細については、以下を参照してください。ダブルポインタの問題
もう一度この質問に戻ると、最初の順序付けられた配列も順序付けられていることを考慮する必要があります。したがって、ゼロより小さい2乗部分の順序は大きいものから小さいものへ、ゼロより大きい部分の2乗順序は小さいものから大きいものへです。 。衝突ポインタメソッドを使用する方が適しています。完全なコードは次のとおりです。
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
sort = [-1]*len(nums)
num = len(nums)-1
k,i= num,0
while i<=num:
left = nums[i]*nums[i]
right = nums[num]*nums[num]
if left < right:
sort[k] = right
num-=1
else:
sort[k]=left
i+=1
k -= 1
return sort
実行結果は、77.7%のユーザーが敗北していることを示しています(各提出によって敗北しているユーザーは異なり、各人のコンピューター構成によって異なる場合があります)、ほとんどのユーザーを超えている限り、アルゴリズムはOKであることを示しています。
1.3まとめ
この質問の鍵は、ダブルポインターの概念を理解することです。一般的な理解があるかもしれませんが、後でアルゴリズムのトレーニングを強化する必要があります。理解しやすくするために、衝突するポインタを使用して、より長い例を見てみましょう。
たとえば、入力配列[-8, -5, -3, -1, 2, 4, 5, 7]
は、上記のアルゴリズムを通過した後、最初に2乗され、次に取得され[64, 25, 9, 1, 4, 16, 25, 49]
ます。次に、左端と右端を比較し、大きい方を右側に配置して、並べ替えます。
- 1)最初のステップでは、[64、25、9、1、4、16、25、49]の比較は[ 25、9、1、4、16、25、49、64 ]になります。
- 2)2番目のステップでは、[25、9、1、4、16、25、49、64]の比較は[ 9、1、4、16、25、25、49、64 ]になります。
- 3)3番目のステップでは、[9、1、4、16、25、25、49、64]の比較は[ 1、4、9、16、25、25、49、64 ]になります。
- 4)4番目のステップでは、[1、4、9、16、25、25、49、64]を比較した後、最終結果は[1、4、9、16、25、25、49、64]になります。
時間計算量はO(n)O(n)のみであることがわかります。O (n )、スペースの複雑さはO(1)O(1)O (1 )。