Memandangkan nombor tatasusunan integer, kembalikan benar jika wujud tiga ganda indeks (i, j, k) supaya i < j < k dan nombor[i] < nombor[j] < bilangan [k]. Jika tiada indeks sedemikian wujud, kembalikan palsu.
Bolehkah anda melaksanakan penyelesaian yang berjalan dalam kerumitan masa O(n) dan kerumitan ruang O(1)?
Untuk menyelesaikan masalah ini dengan cekap, kita perlu menjejaki nilai terkecil dan kedua terkecil yang ditemui setakat ini. Jika kita menemui nilai ketiga yang lebih besar daripada nilai kedua terkecil, maka kita telah menemui tiga kali ganda yang semakin meningkat.
Penyelesaian brute force melibatkan pemeriksaan semua kembar tiga yang mungkin untuk melihat sama ada wujud satu yang memenuhi syarat i < j < k dan nombor[i] < nombor[j] < bilangan [k]. Pendekatan ini mempunyai kerumitan masa O(n^3), yang tidak cekap untuk saiz input yang besar.
function increasingTripletBruteForce(nums: number[]): boolean { const n = nums.length; for (let i = 0; i < n - 2; i++) { for (let j = i + 1; j < n - 1; j++) { for (let k = j + 1; k < n; k++) { if (nums[i] < nums[j] && nums[j] < nums[k]) { return true; } } } } return false; }
Penyelesaian brute force tidak cekap dan tidak sesuai untuk saiz input yang besar.
Penyelesaian yang dioptimumkan melibatkan lelaran melalui tatasusunan sambil mengekalkan dua pembolehubah, pertama dan kedua, yang mewakili nilai terkecil dan kedua terkecil yang ditemui setakat ini. Jika kita mendapati nilai yang lebih besar daripada saat, maka kita akan kembali benar.
function increasingTriplet(nums: number[]): boolean { let first = Infinity; let second = Infinity; for (let num of nums) { if (num <= first) { first = num; // smallest value } else if (num <= second) { second = num; // second smallest value } else { return true; // found a value greater than second smallest, thus an increasing triplet exists } } return false; }
console.log(increasingTripletBruteForce([1,2,3,4,5])); // true console.log(increasingTripletBruteForce([5,4,3,2,1])); // false console.log(increasingTripletBruteForce([2,1,5,0,4,6])); // true console.log(increasingTripletBruteForce([1,1,1,1,1])); // false console.log(increasingTripletBruteForce([1,2])); // false console.log(increasingTripletBruteForce([1,2,3])); // true console.log(increasingTripletBruteForce([1,5,0,4,1,3])); // true console.log(increasingTriplet([1,2,3,4,5])); // true console.log(increasingTriplet([5,4,3,2,1])); // false console.log(increasingTriplet([2,1,5,0,4,6])); // true console.log(increasingTriplet([1,1,1,1,1])); // false console.log(increasingTriplet([1,2])); // false console.log(increasingTriplet([1,2,3])); // true console.log(increasingTriplet([1,5,0,4,1,3])); // true
Masalah Subray:
Teknik Dua Mata:
Algoritma Di Tempat:
Dengan mempraktikkan masalah dan strategi sedemikian, anda boleh meningkatkan kemahiran menyelesaikan masalah anda dan lebih bersedia untuk pelbagai cabaran pengekodan.
Atas ialah kandungan terperinci Tawarikh Pengekodan TypeScript: Meningkatkan Susunan Tiga Kali. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!