मान लीजिए हमारे पास nums1 और nums2 संख्याओं की दो सूची है। और दो नंबर लोअर और अपर भी होते हैं। हमें जोड़े की संख्या ज्ञात करनी है (i, j) जैसे कि कम ≤ nums1[i]^2 + nums2[j]^2 ≤ ऊपर।
इसलिए, यदि इनपुट nums1 =[5, 3, 2] nums2 =[8, 12, 6] निचला =10 ऊपरी =50 जैसा है, तो आउटपुट 2 होगा क्योंकि जोड़े (1, 2) और ( 2, 2)
- 10 <=3^2 + 6^2 <<50 =10 <=45 <<50
- 10 <=2^2 + 6^2 <<50 =10 <=40 <<50
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
- संख्या 1 में प्रत्येक तत्व को उसके वर्ग से बदलें
- संख्या 2 में प्रत्येक तत्व को उसके वर्ग से बदलें
- n :=nums1 का आकार
- m :=nums2 का आकार
- यदि n> m , तो
- अंक 1 और अंक 2 बदलें
- स्वैप n और m
- nums2 :=लिस्ट nums2 को सॉर्ट करें
- res :=0
- प्रत्येक e1 के लिए nums1 में, करें
- st :=nums2 में डालने के लिए सबसे अधिक स्थान छोड़ दिया (निचला - e1) ताकि तत्वों को क्रमबद्ध किया जा सके
- en :=nums2 में डालने के लिए सबसे सही स्थिति (ऊपरी - e1) ताकि तत्वों को क्रमबद्ध किया जा सके
- गिनती :=en - सेंट
- res :=res + count
- रिटर्न रेस
उदाहरण
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
from bisect import bisect_left, bisect_right def solve(nums1, nums2, lower, upper): nums1 = [i * i for i in nums1] nums2 = [i * i for i in nums2] n, m = len(nums1), len(nums2) if n > m: nums1, nums2 = nums2, nums1 n, m = m, n nums2 = sorted(nums2) res = 0 for e1 in nums1: st = bisect_left(nums2, lower - e1) en = bisect_right(nums2, upper - e1) count = en - st res += count return res nums1 = [5, 3, 2] nums2 = [8, 12, 6] lower = 10 upper = 50 print(solve(nums1, nums2, lower, upper))
इनपुट
[5, 3, 2], [8, 12, 6], 10, 50
आउटपुट
2