首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果每个元素可以被值k递增或递减,则打印数组的所有可能的算法。

如果每个元素可以被值k递增或递减,则打印数组的所有可能的算法。
EN

Stack Overflow用户
提问于 2021-06-17 11:51:11
回答 2查看 103关注 0票数 0

为了更好地理解最小数组高度问题(https://practice.geeksforgeeks.org/problems/minimize-the-heights3351/1),我想首先通过Brute方法来解决它,在这种方法中,数组的每个元素可以增加一次,也可以减少一次,所以总功率n为2,(n =数组长度)可能是数组的组合,然后找到最小差,但这不是一个最佳的解决方案。不过,如果我想这样做,我将如何获得这些组合?

例如:

代码语言:javascript
运行
复制
If array = {2,5,9} & k = 2

Combinations are:
 2-2, 5-2, 9-2
 2+2, 5+2, 9+2

 2-2, 5+2, 9+2
 2-2, 5+2, 9-2
 2-2, 5-2, 9+2

 2+2, 5-2, 9-2
 2+2, 5+2, 9-2
 2+2, 5-2, 9+2

我尝试了连续数组方法,但它不起作用:

代码语言:javascript
运行
复制
int arr[] = {4,5,6};
    for (int i = 0; i < arr.length; i++) {
        System.out.println("");

        for (int j = i; j < arr.length; j++) {
            System.out.println("");


            for (int k = 0; k < arr.length; k++) {
                if (k == j) {
                    System.out.print(arr[k] + "  +2 " + "  , ");
                } else {
                    System.out.print(arr[k] + "  -2 " + "  , ");
                }
            }

        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-17 12:59:16

您可以考虑递归地创建这些数组。

代码语言:javascript
运行
复制
fn(int a[],int index,finalArray[][](array of arrays)){
  if(index == a.length()){
   finalArray.push(a);
   return;
  }
  a[index]+=2;
  fn(a,index+1,finalArray)
  a[index]-=4;
  fn(a,index+1,finalArray)
  a[index]+=2
}

您也可以在这里查看:https://ideone.com/Y2L5DQ

票数 1
EN

Stack Overflow用户

发布于 2021-06-18 06:47:40

给出了用贪心法求解该问题的方法。我们必须找到highestlowest塔的高度。但是,由于我们需要最小化之间的差异,我们需要发现降低了最高的塔,增加了最低的塔。这些词是理解解决方案的关键。以下是直截了当的贪婪方法:

首先,定义两个变量来存储tower.

  • Greedy Step的最大和最小高度:对于数组中的每个元素,添加和减去k。现在,我们需要存储最大和最低高度。现在,在存储最大和最小高度时,请记住,我们的目标是使最小化--塔顶的最大高度和最小高度之间的差异。因此,在获得总体最大高度和增加最小高度后,需要降低最大高度,增加最小,得到最大高度和最小高度的最小差值。

程序代码:

代码语言:javascript
运行
复制
#include<bits/stdc++.h>
using namespace std;
int main(){
        int k,n;
        int arr[101];
        cin>>k>>n;
        for(int i=0;i<n;i++){
                cin>>arr[i];
        }
        int minh = INT_MAX,maxh=INT_MIN;
        for(int i=0;i<n;i++){
                if(arr[i] >=k){
                        if(arr[i]-k > maxh){
                                maxh=arr[i]-k;
                        }
                }
                if(arr[i]+k < minh){
                        minh=arr[i]+k;
                }
        }
        cout<<maxh<<endl<<minh<<endl;
        cout<<(maxh-minh)<<endl;
        return 0;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68018767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档