You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修正索引以正确提取有序数组中的所有升序三元组

修正索引逻辑,提取有序数组的所有升序三元组

嘿,我懂你现在的困扰——三层循环的索引边界没设置对,导致没法遍历出所有符合要求的升序三元组。其实核心逻辑很简单:因为数组已经排好序了,只要保证三个元素的索引满足 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:40:40