สมมติว่าเรามีรายการที่มีค่าบวกเรียกว่า nums และยังมีจำนวนบวก k ด้วย เราต้องหาความยาวของรายการย่อยที่สั้นที่สุด (อาจว่างเปล่า) ที่เราลบออกจาก nums ได้ ดังนั้นผลรวมขององค์ประกอบที่เหลือหารด้วย k ลงตัว แต่เราไม่สามารถลบรายการทั้งหมดได้ หากไม่มีรายการย่อยที่จะลบ ให้คืนค่า -1
ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[5,8,6,3] k =8 ผลลัพธ์จะเป็น 1 เนื่องจากผลรวมปัจจุบันขององค์ประกอบของ [5,8,6,3] เท่ากับ 22 ถ้าเรา ลบรายการย่อย [6] ของความยาว 1 แล้วผลรวมคือ 16 ซึ่งหารด้วย 8 ลงตัว
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- rem :=(ผลรวมขององค์ประกอบทั้งหมดที่มีอยู่ใน nums + k) mod k
- ถ้า rem เหมือนกับ 0 แล้ว
- คืน 0
- n :=ขนาดของ nums
- สันนิษฐาน :=0
- mp :=พจนานุกรม เริ่มต้นเก็บ -1 สำหรับคีย์ 0
- res :=n
- สำหรับฉันในช่วง 0 ถึง n - 1 ทำ
- สันนิษฐาน :=presum + nums[i]
- m :=(presum + k) mod k
- mp[m] :=ฉัน
- ถ้า (m - rem + k) mod k มีอยู่ใน mp แล้ว
- res :=ขั้นต่ำของ res และ (i - mp[(m - rem + k) mod k])
- คืนค่า res หาก res ไม่เหมือนกับ n มิฉะนั้น -1
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
def solve(nums, k):
rem = (sum(nums) + k) % k
if rem == 0:
return 0
n, presum = len(nums), 0
mp = {0: -1}
res = n
for i in range(n):
presum += nums[i]
m = (presum + k) % k
mp[m] = i
if (m - rem + k) % k in mp:
res = min(res, i - mp[(m - rem + k) % k])
return res if res != n else -1
nums = [5,8,6,3]
k = 8
print(solve(nums, k)) อินพุต
[5,8,6,3], 8
ผลลัพธ์
1