Cho danh sách nums, tạo danh sách mới mà mỗi phần tử là số lượng phần tử nhỏ hơn nó ở bên phải trong danh sách gốc.
Ví dụ: nums = [4, 5, 9, 7, 2] → kết quả [1, 1, 2, 1, 0].
Giải thuật (Duyệt ngược + Danh sách đã sắp xếp + Bisect)
- Khởi tạo
res = [],inc = [](danh sách đã sắp xếp các phần tử đã duyệt). - Duyệt
numstừ cuối về đầu (pop()):- Lấy
num = nums.pop(). - Dùng
bisect_left(inc, num)tìm vị trí chèn → chính là số phần tử nhỏ hơnnumtronginc. - Thêm vị trí này vào
res. - Chèn
vàoincgiữ thứ tự sắp xếp (bisect.insort).
- Lấy
- Đảo ngược
resvà trả về.
Ví dụ minh họa
import bisect
class Solution:
def solve(self, nums):
res, inc = [], []
while nums:
num = nums.pop()
res.append(bisect.bisect_left(inc, num))
bisect.insort(inc, num)
return res[::-1]
ob = Solution()
nums = [4, 5, 9, 7, 2]
print(ob.solve(nums)) # Output: [1, 1, 2, 1, 0]
Đầu vào
[4, 5, 9, 7, 2]
Đầu ra
[1, 1, 2, 1, 0]