剣指offer:配列を最小にする数(Python)
2228 ワード
タイトルの説明
正の整数配列を入力し、配列内のすべての数字をつなぎ合わせて1つの数に並べ、つなぎ合わせることができるすべての数字の中で最小の1つを印刷します.例えば配列{3,32321}を入力すると、この3つの数字が並べられる最小数字は321323となる.
問題を解く構想.
カスタムルールのクイックソートアルゴリズムで解決します.すなわち,この問題の並べ替え規則は,通常の並べ替えアルゴリズムと比較して単純に2つの数の大きさを比較するのではなく,問題の意味に合わせて組合せ数の大きさを比較する.
Pythonコード
より直感的に比較し,理解を容易にするために,文末は一般的な高速配列アルゴリズムを与えた.
正の整数配列を入力し、配列内のすべての数字をつなぎ合わせて1つの数に並べ、つなぎ合わせることができるすべての数字の中で最小の1つを印刷します.例えば配列{3,32321}を入力すると、この3つの数字が並べられる最小数字は321323となる.
問題を解く構想.
カスタムルールのクイックソートアルゴリズムで解決します.すなわち,この問題の並べ替え規則は,通常の並べ替えアルゴリズムと比較して単純に2つの数の大きさを比較するのではなく,問題の意味に合わせて組合せ数の大きさを比較する.
Pythonコード
def strSort(self, list):
if len(list) <= 1:
return list
left = self.strSort([i for i in list[1:] if (i+list[0]) < (list[0]+i)])
right = self.strSort([i for i in list[1:] if i+list[0] >= list[0] + i])
return left+[list[0]]+right
より直感的に比較し,理解を容易にするために,文末は一般的な高速配列アルゴリズムを与えた.
def quick_sort(self, list):
if len(list) < 2:
return list[:]
left = (self.quick_sort([i for i in list[1:] if i <= list[0]]))
right = (self.quick_sort([i for i in list[1:] if i > list[0]]))
return left + [list[0]] + right