如何修正索引以正确提取有序数组中的所有升序三元组
修正索引逻辑,提取有序数组的所有升序三元组
嘿,我懂你现在的困扰——三层循环的索引边界没设置对,导致没法遍历出所有符合要求的升序三元组。其实核心逻辑很简单:因为数组已经排好序了,只要保证三个元素的索引满足 i < j < k,对应的元素自然就是升序的,咱们只要把循环的起始和结束边界按这个规则调整就行。
问题出在哪?
你原来的循环里,j固定从2开始、k固定从3开始,这会导致重复遍历(比如i=1时j=2,k跑一遍;但i=2时j应该从3开始),而且没法保证j始终在i后面、k始终在j后面,自然漏了很多组合或者重复提取。
修正后的代码(Matlab语法)
array = [3 2 1 5]; array = sort(array); % 排序后得到 [1 2 3 5] triplets = []; % 初始化存储三元组的矩阵 for i = 1:length(array)-2 % j 必须从 i 的下一个位置开始,确保 j > i for j = i+1:length(array)-1 % k 必须从 j 的下一个位置开始,确保 k > j for k = j+1:length(array) % 将当前三元组追加到结果中 triplets = [triplets; array(i) array(j) array(k)]; end end end disp(triplets);
代码解释
- 外层循环
i:从1开始,到length(array)-2结束——因为要给j和k各留一个位置,比如数组长度为4时,i最多到2(索引从1开始),这样j可以取3,k取4。 - 中层循环
j:从i+1开始,到length(array)-1结束——保证j在i后面,同时给k留一个位置。 - 内层循环
k:从j+1开始,到数组末尾结束——保证k始终在j后面,这样三个索引严格递增,对应的元素自然是升序的。
用你举的例子[1 2 3 4]测试,这段代码会输出:
1 2 3 1 2 4 2 3 4
完全符合你的预期。
如果数组有重复元素(比如[1 1 2 3]),这段代码也会正确提取所有合法的升序三元组,比如[1 1 2]、[1 1 3]等,因为只要索引递增,即使元素值重复,也是符合升序要求的。
内容的提问来源于stack exchange,提问作者Mattia Surricchio
相关产品推荐
相关产品推荐

