C ++中的美丽安排II

假设我们有两个整数n和k,我们需要构造一个包含n个不同的正整数的列表,范围从1到n,并遵循以下规则-

考虑列表为[a1,a2,a3,...,an],然后列表[| a1-a2 |,| a2-a3 |,| a3-a4 |,...,| an-1-an |]恰好有k个唯一整数。因此,如果有多个答案,请显示其中任何一个。

如果输入像n = 3且k = 2,则结果将为[1,3,2]。[1,3,2]具有三个不同的正整数,范围从1到3。[2,1]具有正好2个不同的整数1和2。

为了解决这个问题,我们将遵循以下步骤-

  • 定义数组ret

  • 对于i:= 1,j:= n,检查i <= j

    • 如果k为奇数,则插入i,否则将j插入ret

    • 如果k为奇数,则将i加1,否则将j减1

    • 将k减1

    • 如果k> 1,则

    • 否则将我插入res并将i增加1

    • 返回ret

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<int> v){
       cout << "[";
       for(int i = 0; i<v.size(); i++){
          cout << v[i] << ", ";
       }
       cout << "]"<<endl;
    }
    class Solution {
       public:
       vector<int> constructArray(int n, int k) {
          vector <int> ret;
          for(int i = 1, j = n; i <= j; ){
             if(k > 1){
                ret.push_back(k % 2 ? i : j);
                if(k % 2 == 1){
                   i++;
                }else j--;
                k--;
             } else {
                ret.push_back(i++);
            }
          }
          return ret;
       }
    };
    main(){
       Solution ob;
       print_vector(ob.constructArray(3, 2));
    }

    输入项

    3
    2

    输出结果

    [3, 1, 2, ]