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 };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)