Find Target Indices After Sorting Array

# 問題

配列numsと整数targetが与えられる.numsを昇順に整列したときにnums[i] == targetを満たすインデックスiをすべて求めよ.

1
2
nums = [1, 2, 5, 2, 3], target = 2
-> sorted nums = [1, 2, 2, 3, 5] -> ans = [1, 2]

# 解法1

言われたとおりにソートしてから位置を探す.ソートに時間がかかって$O(n \log n)$

1
2
3
4
5
6
7
8
class Solution:
    def targetIndices(self, nums: List[int], target: int) -> List[int]:
        nums.sort()
        ans = []
        for i, num in enumerate(nums):
            if num == target:
                ans.append(i)
        return ans

# 解法2

整列後の配列に置いて,targetと等しい要素の位置を決定するのに,targetより大きい要素が整列されている必要はない.「targetより小さい値が何個あるのか」と「targetと等しい値が何個あるのか」で答えは求まる.

numsを端から一舐めすれば十分で$O(n)$

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Solution:
    def targetIndices(self, nums: List[int], target: int) -> List[int]:
        cnt = 0
        less = 0
        for num in nums:
            if num == target:
                cnt += 1
            elif num < target:
                less += 1
        ans = []
        for i in range(cnt):
            ans.append(less + i)
        return ans

# 出典

Hugo で構築されています。
テーマ StackJimmy によって設計されています。