スポンサーリンク

【LeetCode】977. Squares of a Sorted Array 解答・解説【Python】

スポンサーリンク
スポンサーリンク
この記事は約3分で読めます。

 

問題

原文

Given an integer array nums sorted in non-decreasing order, return an array of the squares of each number sorted in non-decreasing order.

 

Example 1:

Example 2:

 

Constraints:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums is sorted in non-decreasing order.

 

Follow up: Squaring each element and sorting the new array is very trivial, could you find an O(n) solution using a different approach?

 

内容

整数配列numsが昇順で与えられます。各要素を二乗して昇順にソートした配列を返してください。

 

※正しくない可能性があります。

方針

前提

・O(n)解ではtwo pointerを使う

実装のイメージ

 

解答

解答1:

 

各要素を二乗してソートした。何も考えずに解くとこうなった。

たぶん、これだけで終わっちゃいけない。

解答2

 

two pointerを使うと時間計算量O(n)で解けるらしい。

両端に2つポインタを置き、絶対値の大きい方を別の配列に格納していく。

絶対値の大きい順に格納していくので、最後に逆順にして返せば良い。

また、numsは昇順で用意してくれている。

[-3,-,2,-1,0,1,2,3]

両端に近づくほど絶対値は大きくなり、真ん中に近づくほど絶対値は小さくなる。

だから両端から絶対値の大きい方を比較し、1つずつ内側に向かって操作することで二乗後の配列は降順で作ることができる。

配列を新しく用意するので、空間計算量はO(n)で合っているのかな?

解答3:Rust

丸パクリだけど写経させていただいた。Python以外も書けるようになりたい。

 

補足・参考・感想

■補足

square:二乗

non-decreasing order:非降順

■参考

 

■感想

two pointerを使える問題もそろそろ自力で解きたい

両端から狭めるパターン、両端に向けて広がるパターン、for文の中で1つ進むポインタと2つ進むポインタがあるパターンなど整理したい。

 

 

前:15. 3Sum

次:283. Move Zeroes

LeetCode 解答・解説記事一覧

コメント