สมมติว่าเราต้องหาเลขน่าเกลียดตัวที่ n ดังนั้นเราต้องกำหนดวิธีที่จะหาได้ อย่างที่เราทราบดีว่าเลขขี้เหร่คือตัวเลขเหล่านั้น ซึ่งตัวประกอบเฉพาะคือ 2, 3 และ 5 ดังนั้นถ้าเราต้องการหาเลขขี้เหร่ตัวที่ 10 มันจะเป็น 12 เนื่องจากจำนวนที่น่าเกลียดสองสามตัวแรกคือ 1, 2, 3 4, 5, 6, 8, 9, 10, 12
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
สร้างอาร์เรย์ v ขนาด n + 1
-
ถ้า n =1 ให้คืนค่า 1
-
สอง :=2, สาม =3 และห้า =5, towIndex :=2, threeIndex :=2 และ fiveIndex :=2
-
สำหรับฉันอยู่ในช่วง 2 ถึง n
-
curr :=นาทีของสอง, สามและห้า
-
v[i] :=curr
-
ถ้า curr =สอง ดังนั้น two :=v[twoIndex] * 2 ให้เพิ่ม twoIndex ขึ้น 1
-
ถ้า curr =สาม ดังนั้นสาม :=v[threeIndex] * 3 ให้เพิ่ม threeIndex ขึ้น 1
-
ถ้าสกุลเงิน =ห้า ดังนั้นห้า :=v[fiveIndex] * 3 ให้เพิ่ม fiveIndex ขึ้น 1
-
-
กลับ v[n]
ตัวอย่าง(C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { public: int nthUglyNumber(int n) { vector <int> v(n + 1); if(n == 1){ return 1; } int two = 2, three = 3, five = 5; int twoIdx = 2; int threeIdx = 2; int fiveIdx = 2; for(int i = 2; i <= n; i++){ int curr = min({two, three, five}); v[i] = curr; if(curr == two){ two = v[twoIdx] * 2;; twoIdx++; } if(curr == three){ three = v[threeIdx] * 3; threeIdx++; } if(curr == five){ five = v[fiveIdx] * 5; fiveIdx++; } } return v[n]; } }; main(){ Solution ob; cout << (ob.nthUglyNumber(10)); }
อินพุต
10
ผลลัพธ์
12