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

时间:2014-09-06 17:09:45

标签: 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; i++) {
    for (j = i; j < myArray.length; j++)
    {

    }
}

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

3 个答案:

答案 0 :(得分:1)

#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;
}

答案 1 :(得分:-1)

您需要将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]

答案 2 :(得分:-1)

如果你想找到一个数组的所有子数组,那么首先你应该理解数组的子数组应该是连续的,但是在字符串的情况下,没有必要连续例如:如果我们有一个类似的数组:[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;
}
相关问题