使用单个循环从一个数组中获取所有子数组

本文关键字:数组 一个 获取 单个 循环 | 更新日期: 2023-09-27 18:20:57

我想知道是否有一种算法/模式可以让某人获取/解析给定数组的所有子数组例如使用简单循环。

例如:对于阵列myArray{0,1,2,3},我需要

myArray(0,0)myArray(0,1),myArray(0,2),myArray(0,3)
myArray(1,1)myArray(1,2),myArray(1,3)
myArray(2,2)myArray(2,3),
myArray(3,3)

我不想使用类似的东西

for (i = 0; i < myArray.length; i++) {
    for (j = i; j < myArray.length; j++)
    {
    }
}

因为我希望我的算法更快。

使用单个循环从一个数组中获取所有子数组

#include <stdio.h>
int main() {
    int myArray[] = {0,1,2,3};
    int myArrayLength = sizeof(myArray)/sizeof(*myArray);
    int i, j;
    for(j=i=0;i<myArrayLength;++i){
        printf("(%d,%d)", myArray[j], myArray[i]);
        if(i == myArrayLength -1){
            i = j++;//++j - 1;
            printf("'n");
        }
    }
    return 0;
}

您需要将j的初始化从j = 0修改为j = i,并迭代所有可能的对。实现示例(Java):

public static void main(String[] args) {
    int[] arr = {1,2,3,4};
    List<Integer[]> res = allPairs(arr);
    for(Integer[] tmp : res) {
        System.out.println(Arrays.toString(tmp));
    }
}
private static List<Integer[]> allPairs(int [] myArray) {
    List<Integer[]> res = new ArrayList<>();
    for (int i = 0; i < myArray.length; i++) {
        for (int j = i; j < myArray.length; j++) {
            Integer[] tmp = new Integer[2];
            tmp[0] = myArray[i];
            tmp[1] = myArray[j];
            res.add(tmp);
        }
    }
    return res;
}

输出

[1, 1]
[1, 2]
[1, 3]
[1, 4]
[2, 2]
[2, 3]
[2, 4]
[3, 3]
[3, 4]
[4, 4]

如果你想找到一个数组的所有子数组,那么首先你应该明白数组的子数组应该是连续的,但在字符串的情况下不需要连续,例如:如果我们有一个像[1,2,3]这样的数组,在这种情况下有子数组,比如:(1),(2),(3),(1,2),(2,3)和(1,2,3)。生成阵列子阵列的程序:

#include<bits/stdc++.h>
using namespace std;
// Prints all subarrays in arr[0..n-1]
void subArray(int arr[], int n)
{
    for (int i=0; i <n; i++)
    {
        for (int j=i; j<n; j++)
        {
            for (int k=i; k<=j; k++)
                cout << arr[k] << " ";
            cout << endl;
        }
    }
}
// Driver program
int main()
{
    int arr[] = {1, 2, 3, 4};
    int n = sizeof(arr)/sizeof(arr[0]);
    cout << "All Non-empty Subarrays'n";
    subArray(arr, n);
    return 0;
}