代码-用递归能实现一个数组划分的算法么?

问题描述

用递归能实现一个数组划分的算法么?

用递归能实现一个数组划分的算法么?

给一个数组,长度为m,划分成n个子数组(每个数组起码有一个元素),比如
{1 2 3 4 5}划分成2个:
1, 2345 12,345 123,45 1234,5一共5个分法
{1234}分成3个
1,2,34 1,23,4 12,3,4,一共3个分法
求代码怎么写

解决方案

 IEnumerable<IEnumerable<IEnumerable<int>>> Split(IEnumerable<int> source, int n)
{
  int[] splitter = Enumerable.Range(1, n - 1).ToArray();
  splitter[n - 2]--;
  int[] lastsp = Enumerable.Range(source.Count() - n, n -1).ToArray();
  while (splitter.Zip(lastsp, (x, y) => x != y).Any(x => x == true))
  {
    for (int i = n - 2; i >= 0; i--)
    {
      if (splitter[i] < lastsp[i])
      {
        splitter[i]++;
        for (int j = i + 1; j < n - 1; j++)
        {
          splitter[j] = splitter[i] + j - i;
        }
        break;
      }
    }
    IEnumerable<int>[] result = new IEnumerable<int>[n];
    int acc = 0;
    for (int i = 0; i < n; i++)
    {
      if (i == n - 1)
      {
        result[i] = source.Skip(acc);
      }
      else
      {
        result[i] = source.Skip(acc).Take(splitter[i] - acc);
        acc = splitter[i];
      }
    }
    yield return result;
  }
}
时间: 2024-10-03 10:19:49

代码-用递归能实现一个数组划分的算法么?的相关文章

Javascript中克隆一个数组的实现代码

 这篇文章主要是对在Javascript中克隆一个数组的实现代码进行了介绍.需要的朋友可以过来参考下,希望对大家有所帮助 08年一家公司JS面试题,职位是javascript工程师(赴google)   面试官问我如何克隆一个数组,当时想了下js的Object没有clone方法,java的Object有.   那怎么得到一个新数组呢?   我当时回答:用一个loop将源数组元素依次push到新数组中.这是最简单的方法,但显然不是面试官想要的答案.   最后告知我:利用Array的slice方法.

递归原理-java 递归 有一个数组 1,2,2,3,5 用java打印出所有不同的排列顺序

问题描述 java 递归 有一个数组 1,2,2,3,5 用java打印出所有不同的排列顺序 有一个数组 1,2,2,3,5 用java打印出所有不同的排列顺序:如12235,12325,13225

c++-递归~问一个幼稚的问题,有哪个大神能讲一下递归,结合代码,老是理解不了。先谢过了

问题描述 递归-问一个幼稚的问题,有哪个大神能讲一下递归,结合代码,老是理解不了.先谢过了 谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢 解决方案 递归就是自己调用自己,如一般要有一个调用递归的条件 /** * 递归实现前序遍历 * @author linbingwen * @since 2015年8月29日 * @param treeNode */ public static void preOrderMethodOne(TreeNode treeNode) { if (nul

递归-C语言:给定一个数组,求和为定值的组合的个数(不限组合内的数字个数)怎么解决?

问题描述 C语言:给定一个数组,求和为定值的组合的个数(不限组合内的数字个数)怎么解决? 问题在于只用C语言,递归和回溯都不太懂,希望给个大概的思路,初学语言,谢谢了! 解决方案 最简单的就是递归,可是递归你又不懂.递归都不懂,那你几乎和不会写程序也没区别了,那怎么和你解释呢. 解决方案二: 花10分钟时间,就能把递归搞清楚.给你的思路就是磨刀不误砍柴工 解决方案三: 还是递归方便点,不过也可以用循环实现,大致就是暴力枚举,看是否符合要求,如果一组枚举过程中发现累加的值大于给定的值那这种情况后面

Javascript中克隆一个数组的实现代码_javascript技巧

08年一家公司JS面试题,职位是javascript工程师(赴google) 面试官问我如何克隆一个数组,当时想了下js的Object没有clone方法,java的Object有. 那怎么得到一个新数组呢? 我当时回答:用一个loop将源数组元素依次push到新数组中.这是最简单的方法,但显然不是面试官想要的答案. 最后告知我:利用Array的slice方法.示例如下: 复制代码 代码如下: var ary = [1,2,3];//源数组 var ary2 = ary.slice(0);//克隆

PHP中使用array函数新建一个数组_php实例

PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性.由于数组元素的值也可以是另一个数组,树形结构和多维数组也是允许的. array (PHP 4, PHP 5) array - 新建一个数组 说明 复制代码 代码如下: array array ([ mixed $... ] ) 返回根据参数建立的数组.参数可以用 => 运算

php 常用的排序算法代码[冒泡,递归排序

php 常用的排序算法代码[冒泡,递归排序 冒泡排序算法  function bubblesort($arr) { $n=count($arr); for($i=0;$i<$n;$i++) { for($j=$i;$j<=$n-1;$j++) { if($arr[$i]>$arr[$j]) { $temp=$arr[$i]; $arr[$i]=$arr[$j]; $arr[$j]=$temp; } } } return $arr; }  //直接插入排序   function inser

PHP递归删除多维数组中的某个值

今天在做业务逻辑的过程中,需要在一个不确定的多维数组中删除某个特定的key,查了挺长时间加上自己的修改,终于满足了业务逻辑,该方法在修改后应该可以适用于很多地方,所以记录下来以备后用,我这里是一个多维数组,还是json_encode后的,主要目的是删除所有old_tags_id数组中有tag_id=264的数据,顺便要删除相应的tag_name,还有 addtag要减1,,代码如下: 先放递归函数,当然这里是核心,很多人看了这个应该就已经知道如何使用了. public function deal

[算法问题]合并两个已经排序的数组为另一个数组

问题描述: 设子数组a[0:k]和a[k+1:n-1]已排好序(0<=k<=n-1).试设计一个合并这两个子数组为排好序的数组a[0:n-1]的算法.要求算法在最坏的情况下所用的计算时间为O(n), 且只用到O(1)的辅助空间. 这一题比较简单,看代码就知道了. #include <stdio.h> void DisplayArray(int *pArray, int nLen) { for (int i = 0; i < nLen; ++i) { printf("