• Careercup


    2014-05-06 06:37

    题目链接

    原题:

    Given an array of (unsorted) integers, arrange them such that a < b > c < d > e... etc.

    题目:给定一个无序的数组,调整元素顺序,使得数组满足a < b > c < d > e ... 这种形式。

    解法:这题没有说明两点:1. 数组元素是否存在重复值。 2. 给定的数组经过调整后是否一定有解。如果确定有解,那么我有两种方法。一种是线性算法,向后扫描的过程中逐个调整相邻元素,使其满足题意的大小交替变化的要求。如果没有重复元素时这种算法一定有解。另一种算法先要求排序数组,然后从数组的两端逐个取元素:小大小大小大...。这种算法对于存在重复元素的情况,也能找出正确解,而前种方法则可能无法处理存在重复元素的数组。排序要求的时间至少是O(n * log(n)),在效率上自然不够高了。对于数组的调整都可以就地完成,无需额外数组。

    代码:

     1 // http://www.careercup.com/question?id=5724823657381888
     2 #include <algorithm>
     3 #include <vector>
     4 using namespace std;
     5 
     6 class Solution {
     7 public:
     8     void arrangeArray(vector<int> &v) {
     9         int n;
    10         
    11         n = (int)v.size();
    12         if (n < 2) {
    13             return;
    14         }
    15         sort(v.begin(), v.end());
    16         interleaveInPlace(v);
    17     };
    18 private:
    19     void interleaveInPlace(vector<int> &v) {
    20         int i, n;
    21         int idx1, idx2;
    22         int tmp1, tmp2;
    23         
    24         n = (int)v.size();
    25         if (n <= 2) {
    26             return;
    27         }
    28 
    29         idx1 = n - 1;
    30         tmp1 = v[idx1];
    31         for (i = 0; i < n - 1; ++i) {
    32             idx2 = (idx1 >= (n + 1) / 2) ? (2 * n - 1 - 2 * idx1) : (idx1 * 2);
    33 
    34             tmp2 = v[idx2];
    35             v[idx2] = tmp1;
    36             tmp1 = tmp2;
    37 
    38             idx1 = idx2;
    39         }
    40     };
    41 };
  • 相关阅读:
    [Agc081F/At2699] Flip and Rectangles
    [CF1216C] White Sheet
    stegsolve使用探究
    栅栏密码
    wireshark常用命令
    某团队线下赛AWD writeup&Beescms_V4.0代码审计
    某线下赛AWD
    BBScan — 一个信息泄漏批量扫描脚本
    ISG2018 web题Writeup
    巅峰极客第二场CTF部分writeup
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3710678.html
Copyright © 2020-2023  润新知