Cho một mảng số nguyên, cần tìm một mảng con liên tục sao cho nếu chỉ sắp xếp mảng con đó theo thứ tự tăng dần thì toàn bộ mảng cũng sẽ được sắp xếp. Yêu cầu tìm mảng con ngắn nhất thỏa mãn và trả về độ dài của nó. Ví dụ, với mảng [2,6,4,8,10,9,15], đầu ra là 5 (mảng con là [6,4,8,10,9]).
Thuật toán giải quyết
- Tạo mảng
reslà bản sao đã sắp xếp của mảng gốcnums. - Khởi tạo danh sách
rđể lưu các chỉ số nơi hai mảng khác nhau. - Duyệt qua từng chỉ số
i:- Nếu
nums[i] != res[i], thêmivào danh sáchr.
- Nếu
- Nếu
rrỗng, trả về0(mảng đã sắp xếp). Nếurchỉ có 1 phần tử, trả về1. - Trả về
r[-1] - r[0] + 1(độ dài mảng con từ chỉ số khác nhau đầu tiên đến cuối cùng).
Ví dụ (Python)
class Solution(object):
def findUnsortedSubarray(self, nums):
res = sorted(nums)
r = []
for i in range(len(res)):
if nums[i] != res[i]:
r.append(i)
if not r:
return 0
if len(r) == 1:
return 1
return r[-1] - r[0] + 1
ob1 = Solution()
print(ob1.findUnsortedSubarray([2, 6, 4, 8, 10, 9, 15]))
Đầu vào
[2, 6, 4, 8, 10, 9, 15]
Đầu ra
5