यह चुनौती एक प्रवेश परीक्षा से लेकर बंद संख्या वाले साइबर सुरक्षा पाठ्यक्रम तक है। वैसे भी इसका साइबर सुरक्षा से कोई लेना-देना नहीं है, यह सिर्फ छात्रों को तार्किक और कोडिंग कौशल का परीक्षण करने के लिए है।
कार्य
एक ऐसा प्रोग्राम लिखें जो किसी सरणी से प्रविष्टियाँ निकालता है ताकि शेष मान कड़ाई से घटते क्रम में क्रमबद्ध हो जाएँ और उनका योग सभी अन्य संभावित घटते क्रमों के बीच अधिकतम हो जाए।
इनपुट और आउटपुट
इनपुट पूर्णांक मानों की एक सरणी होगी जो सभी की तुलना में कड़ाई से अधिक 0
और सभी भिन्न होती है । आप यह चुनने के लिए स्वतंत्र हैं कि फ़ाइल, कमांड लाइन या स्टडिन से इनपुट पढ़ना है या नहीं।
आउटपुट एक हो जाएगा उतरते-क्रमबद्ध इनपुट एक है जिसका योग किसी अन्य संभव उतरते-छाँटे गए subarray से अधिक है की subarray।
नोट: [5, 4, 3, 2]
का एक अवगुण है [5, 4, 1, 3, 2]
, भले ही 4
और 3
आसन्न न हो। सिर्फ इसलिए कि 1
पॉप किया गया था।
Bruteforce समाधान
पाठ्यक्रम का सबसे सरल समाधान दिए गए सरणी के सभी संभावित संयोजनों के बीच पुनरावृत्ति होगा और सबसे बड़ी राशि के साथ एक क्रमबद्ध खोज करेगा, जो कि पायथन में होगा :
import itertools
def best_sum_desc_subarray(ary):
best_sum_so_far = 0
best_subarray_so_far = []
for k in range(1, len(ary)):
for comb in itertools.combinations(ary, k):
if sum(comb) > best_sum_so_far and all(comb[j] > comb[j+1] for j in range(len(comb)-1)):
best_subarray_so_far = list(comb)
best_sum_so_far = sum(comb)
return best_subarray_so_far
दुर्भाग्य से, जाँचने के बाद कि क्या सरणी को सॉर्ट किया गया है, और इसके तत्वों की राशि की गणना करना है और चूंकि यह ऑपरेशन से के लिए कई बार किया जाएगा , इसलिए असममित समय जटिलता होगी
चुनौती
आपका लक्ष्य उपरोक्त ब्रूटफोर्स से बेहतर समय जटिलता प्राप्त करना है। सबसे छोटी स्पर्शोन्मुख समय जटिलता के साथ समाधान चुनौती का विजेता है। यदि दो समाधानों में समान स्पर्शोन्मुख समय जटिलता है, तो विजेता सबसे छोटी स्पर्शोन्मुख स्थानिक जटिलता वाला होगा।
नोट: आप पढ़ने, लिखने और परमाणु की तुलना बड़ी संख्या पर भी कर सकते हैं ।
नोट: यदि दो या दो से अधिक समाधान हैं, तो उनमें से कोई भी वापस आ जाएगा।
परीक्षण के मामलों
Input: [200, 100, 400]
Output: [400]
Input: [4, 3, 2, 1, 5]
Output: [4, 3, 2, 1]
Input: [50, 40, 30, 20, 10]
Output: [50, 40, 30, 20, 10]
Input: [389, 207, 155, 300, 299, 170, 158, 65]
Output: [389, 300, 299, 170, 158, 65]
Input: [19, 20, 2, 18, 13, 14, 8, 9, 4, 6, 16, 1, 15, 12, 3, 7, 17, 5, 10, 11]
Output: [20, 18, 16, 15, 12, 7, 5]
Input: [14, 12, 24, 21, 6, 10, 19, 1, 5, 8, 17, 7, 9, 15, 23, 20, 25, 11, 13, 4, 3, 22, 18, 2, 16]
Output: [24, 21, 19, 17, 15, 13, 4, 3, 2]
Input: [25, 15, 3, 6, 24, 30, 23, 7, 1, 10, 16, 29, 12, 13, 22, 8, 17, 14, 20, 11, 9, 18, 28, 21, 26, 27, 4, 2, 19, 5]
Output: [25, 24, 23, 22, 17, 14, 11, 9, 4, 2]