以0,1,2,3,4,5,6,7,8,9组成一个数组,列出所有不重复的3个数的排列

以0,1,2,3,4,5,6,7,8,9组成一个数组,列出所有不重复的3个数的排列

如数组0,1,2,3 则排列为012,013,023,123这4个

/**
 * 计算结果
 *
 * @param array $arr [0, 1, 2, 3]
 * @param int $num 一维数组的长度-1
 * @param array $tmp 临时存储数据
 * @param bool $first 是否为第一次执行
 * @return array
 */
function calculation(array $arr, int $num, array $tmp = [], bool $first = false): array
{
    $data = [];

    foreach ($arr as $k => $v) {
        if ($first && count($arr) - 1 == $num) return array_merge($data, [$arr]);

        if (!$num) {
            array_push($data, array_merge($tmp, [$v]));
        } else {
            array_shift($arr);

            $data = array_merge($data, calculation($arr, $num - 1, array_merge($tmp, [$v])));
        }
    }

    return $data;
}

// 执行结果为 [0, 1, 2] [0, 1, 3] [0, 2, 3] [1, 2, 3]
calculation([0, 1, 2, 3], 2, [], true);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个经典的问题,可以使用单调栈来解决。 具体思路如下: 1. 定义一个一维数组 heights,用于存储当前行中每个位置的高度,即从当前位置向上数连续的1的个数。 2. 对于每一行,将该行的 heights 数组作为输入,使用单调栈算法计算最大面积。 3. 单调栈算法的基本思路是维护一个栈,栈内元素单调递增,每当遇到一个比栈顶元素小的元素时,就将栈顶元素出栈,并计算以该元素为高度的最大面积。具体实现过程如下: - 定义一个栈 s 和一个变量 max_area,初始值为 0。 - 遍历 heights 数组,对于每个元素 h: - 如果栈为空或者 h 大于等于栈顶元素,则将 h 入栈。 - 否则,将栈顶元素弹出,计算以该元素为高度的最大面积,并更新 max_area。 - 重复上述操作直到栈为空或者 h 大于等于栈顶元素。 - 遍历完 heights 数组后,如果栈不为空,继续计算以栈中每个元素为高度的最大面积,并更新 max_area。 下面是完整的 C++ 实现代码: ```c++ #include <iostream> #include <stack> #include <vector> using namespace std; int largestRectangleArea(vector<int>& heights) { stack<int> s; int max_area = 0; int i = 0; while (i < heights.size()) { if (s.empty() || heights[i] >= heights[s.top()]) { s.push(i++); } else { int h = heights[s.top()]; s.pop(); int w = s.empty() ? i : i - s.top() - 1; max_area = max(max_area, h * w); } } while (!s.empty()) { int h = heights[s.top()]; s.pop(); int w = s.empty() ? i : i - s.top() - 1; max_area = max(max_area, h * w); } return max_area; } int main() { int n, m; cin >> n >> m; vector<vector<int>> matrix(n, vector<int>(m)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> matrix[i][j]; } } int max_area = 0; vector<int> heights(m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (matrix[i][j] == 0) { heights[j] = 0; } else { heights[j]++; } } max_area = max(max_area, largestRectangleArea(heights)); } cout << max_area << endl; return 0; } ``` 该程序首先读入矩阵的行数和列数,然后读入矩阵中每个位置的值。接下来,对于每一行,都计算出 heights 数组,并调用 largestRectangleArea 函数计算以该行为底边的最大矩形面积,并更新 max_area。最后输出 max_area 的值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值