给定一个整数数组 nums,如果存在索引三元组 (i, j, k) 且 i
你能实现一个以 O(n) 时间复杂度和 O(1) 空间复杂度运行的解决方案吗?
为了有效地解决这个问题,我们需要跟踪迄今为止遇到的最小和第二小的值。如果我们找到大于第二小的值的第三个值,那么我们就找到了递增三元组。
暴力解决方案涉及检查所有可能的三元组,看看是否存在满足条件 i
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; }
暴力解决方案效率不高,不适合大输入。
优化的解决方案涉及迭代数组,同时维护两个变量,第一和第二,它们代表迄今为止遇到的最小和第二小的值。如果我们找到大于秒的值,则返回 true。
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
子数组问题:
双指针技术:
就地算法:
通过练习这些问题和策略,您可以提高解决问题的能力,并为各种编码挑战做好更好的准备。
以上是Typescript 编码编年史:增加三元组子序列的详细内容。更多信息请关注PHP中文网其他相关文章!