สมมติว่าเราได้รับรายการตัวเลขและค่าอื่น k คราวนี้งานของเราคือการหาความยาวของลำดับย่อยที่ยาวที่สุดโดยที่ความแตกต่างที่แน่นอนระหว่างองค์ประกอบที่อยู่ติดกันทุกตัวมีค่าสูงสุด k
ดังนั้น หากอินพุตมีค่าเท่ากับ nums =[5, 6, 2, 1, −6, 0, -1, k =4 ผลลัพธ์จะเป็น 6
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชั่น update() นี่จะใช้เวลา i, x
-
ผม :=ผม + n
-
ในขณะที่ฉันไม่เป็นศูนย์ ให้ทำ
-
segtree[i] :=สูงสุดของ segtree[i], x
-
ผม :=ผม / 2
-
-
กำหนดฟังก์ชั่น query() นี่จะใช้เวลา i, j
-
ตอบ :=−อนันต์
-
ผม :=ผม + n
-
j :=j + n + 1
-
ในขณะที่ i
-
ถ้าฉัน mod 2 เหมือนกับ 1 แล้ว
-
ans :=สูงสุดของ ans, segtree[i]
-
ผม :=ผม + 1
-
-
ถ้า j mod 2 เหมือนกับ 1 แล้ว
-
j :=j − 1
-
ans :=สูงสุดของ ans, segtree[j]
-
-
ผม :=ผม / 2
-
เจ :=เจ / 2
-
-
กลับมาอีกครั้ง
-
ในหน้าที่หลัก ให้ทำดังต่อไปนี้ −
-
nums =[5, 6, 2, 1, −6, 0, −1]
-
k =4
-
n =2 ยกกำลัง (ฐานลอการิทึม 2 ของ (ความยาวของ (ตัวเลข) + 1) + 1)
-
segtree :=[0] * 100000
-
snums :=เรียงลำดับรายการ nums
-
index :=สร้างคอลเลกชันโดยที่ x:i สำหรับแต่ละดัชนี i และองค์ประกอบ x ใน (snums)
-
ตอบ :=0
-
สำหรับแต่ละ x เป็นตัวเลข ทำ
-
แท้จริง :=ส่งคืนตำแหน่งซ้ายสุดจาก snums โดยที่ (x − k) สามารถแทรกได้ในขณะที่รักษาลำดับที่จัดเรียงไว้
-
สวัสดี :=(ตำแหน่งซ้ายสุดจาก snums โดยที่ (x + k) สามารถแทรกได้ในขณะที่ยังคงเรียงลำดับ) − 1
-
นับ :=แบบสอบถาม (สวัสดี)
-
อัปเดต (ดัชนี[x], นับ + 1)
-
ans :=สูงสุดของ ans นับ + 1
-
-
กลับมาอีกครั้ง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
import math, bisect class Solution: def solve(self, nums, k): n = 2 ** int(math.log2(len(nums) + 1) + 1) segtree = [0] * 100000 def update(i, x): i += n while i: segtree[i] = max(segtree[i], x) i //= 2 def query(i, j): ans = −float("inf") i += n j += n + 1 while i < j: if i % 2 == 1: ans = max(ans, segtree[i]) i += 1 if j % 2 == 1: j −= 1 ans = max(ans, segtree[j]) i //= 2 j //= 2 return ans snums = sorted(nums) index = {x: i for i, x in enumerate(snums)} ans = 0 for x in nums: lo = bisect.bisect_left(snums, x − k) hi = bisect.bisect_right(snums, x + k) − 1 count = query(lo, hi) update(index[x], count + 1) ans = max(ans, count + 1) return ans ob = Solution() print(ob.solve([5, 6, 2, 1, −6, 0, −1], 4))
อินพุต
[5, 6, 2, 1, −6, 0, −1], 4
ผลลัพธ์
6