Java 使用单个循环从阵列获取所有子阵列

Java 使用单个循环从阵列获取所有子阵列,java,c#,c++,c,arrays,Java,C#,C++,C,Arrays,我想知道是否有一种算法/模式可以让人获取/解析给定数组的所有子数组 例如,使用一个简单的循环 例如:对于数组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;

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

例如:对于数组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++)
    {

    }
}

因为我希望我的算法更快

您需要将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,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;
}

语言标记会有帮助。不是一种替代方法,但是我认为j=1可能需要j=i+1。考虑算法输出的大小。输入的大小是二次的。@ehudt-well,n**2/2。不过,嵌套循环可能是实现这一点的最佳方式。它可以在一个循环中完成,但不会更快。正如你给出的一个例子,这是打印子数组,如:0,00,10,20,3 1,11,21,3 2,22,3 3,3,但有些对,如:1,1,2,2,3,3不是数组的一部分,因为没有两个2,三个和一个1。@singh.indolia请看OP的例子。1,1,2,2,3,3包括在内。在您的示例中,这些都包括在内,但在数组中没有两个3,2和1。@singh.indolia我需要myArray0,0Myarray 0,1,myArray0,2,myArray0,3 myArray1,1Myarray 1,2,myArray1,3,3@singh.indolia你为什么决定OP的要求?至少我的答案是这样的。如果下议院选民只想发表评论,也许这个答案可以改进……问题是1个循环而不是3个嵌套循环,您的时间复杂度为On^3
#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;
}
#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;
}