【问题标题】:Get all subarrays from an array using a single loop使用单个循环从数组中获取所有子数组
【发布时间】:2014-09-06 17:09:44
【问题描述】:

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

例如:对于数组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 = 1 可能需要为j = i + 1
  • 考虑算法输出的大小。它是输入大小的二次方。
  • @ehudt 好吧​​,n**2 / 2。尽管如此,嵌套循环可能是完成此任务的最佳方式。它可以在一个循环中完成,但不会更快。

标签: java c# c++ c arrays


【解决方案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;
}

【讨论】:

  • 举个例子,这是打印子数组,如:(0,0)(0,1)(0,2)(0,3) (1,1)(1,2) (1,3) (2,2)(2,3) (3,3) 但有些对像:(1,1),(2,2),(3,3) 不是数组的一部分,因为有不是两个二、三和一次。
  • @singh.indolia 请参阅 OP 的示例。 (1,1),(2,2),(3,3) 包括在内。
  • 在您的示例中,这些都包括在内,但在数组中没有两个 3 ,2 和 1。
  • @singh.indolia 我需要 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)
  • @singh.indolia 你为什么决定 OP 的请求?至少我的答案是这样的。
【解决方案2】:

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

【讨论】:

  • 如果反对者只想发表评论,也许这个答案可以改进......
【解决方案3】:

如果你想找到一个数组的所有子数组,那么首先你应该明白一个数组的子数组应该是连续的,但如果是字符串,则不需要连续,例如:如果我们有一个像:[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;
}

【讨论】:

  • 问题说 1 个循环而不是 3 个嵌套循环,你的时间复杂度是 O(n^3)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2015-12-04
  • 2015-03-01
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多