【问题标题】:How to find all possible subarrays of an array? [closed]如何找到数组的所有可能子数组? [关闭]
【发布时间】:2016-12-05 10:55:06
【问题描述】:

假设给了我一个数组; A[] = {1,2,3} 我想找到这个数组的所有子数组。答案应该是

{1}
{1,2}
{1,2,3}
{2}
{2,3}
{3}

如何高效地找到一个数组所有可能的子数组?

【问题讨论】:

    标签: arrays data-structures


    【解决方案1】:

    我们可以使用substr函数找到所有可能的子数组。

    代码片段:

           #include<bits/stdc++.h>
           using namespace std;
    
    
           void generateSubstring(string str)
           {
                if(str.size()==0)
                {
                    return;
                }
                else
                {
                    for(int i=0; i<str.size(); i++)
                    {
                        for(int j=1; j<=str.size()-i; j++)
                        {
                            cout<<str.substr(i, i+j)<<endl;
                        }
                    }
                }
            }
    
    
            int main()
            {
                ios::sync_with_stdio(false);
                string str;
                getline(cin, str);
                generateSubstring(str);
                return 0;
            }
    

    【讨论】:

    • 抱歉,这个算法一点都不高效
    【解决方案2】:

    数组 A 的子数组是 A[i..j] 其中0 &lt;= i &lt;= j &lt; n 其中 n 是数组的长度。

    在C语言中可以这样计算:

    #include <stdio.h>
    
    int main(){
        int A[] = {1,2,3,4,5};
        int len=sizeof(A)/sizeof(int);
        for( int i=0; i<len; i++ ){
            for( int j=i; j<len; j++ ){   // Now A[i..j] is the subarray
                for( int k=i; k<=j; k++ )
                    printf("%d ", A[k]);
                printf("\n");
            }
        }
        return 0;
    }
    

    【讨论】:

    • 这种方法的时间复杂度为O(n^3)。这是最有效的方法吗?我认为散列是一种更合适的方法,因为问题是找到子数组efficiently
    • 这种方法是 o(n)3 时间复杂度的方法,不是一种有效的方法。
    【解决方案3】:

    O(n^2) 方法可能是:

    for (int i = 0; i < arr.length; i++) {
        String res = "";
            for (int j = i; j < arr.length; j++) {
                res += arr[j] + " ";
                    System.out.println(res);
        }
    }
    

    【讨论】:

    • 抱歉,这个算法一点效率都没有
    【解决方案4】:

    试试下面的代码:

    def subarray(a, n) :
          for i in range(0,n):
                 for j in range(i, n) :
                       for k in range(i, j+1) :
                              print(a(k), end=" ")
                       print("\n", end=" ")
    a=[1, 2,3,4,5]
    n=len(a)
    print( all non - empty subarrays are:-)
    subarray(a, n) 
    

    【讨论】:

    • 这是一个 O(n^3) 的解决方案,完全没有效率。
    • 抱歉,这个算法一点都不高效
    【解决方案5】:

    在 JavaScript 中

    function subarray(arr){
      let sub = []
      for(let i=0;i<=arr.length-1;i++){
        for(let j=arr.length-1;j>=i;j--){
          sub.push(arr.slice(i,j+1))
        }
      }
      return sub
    }
    

    【讨论】:

    • 抱歉,这个算法一点都不高效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 2011-05-31
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多