对给定数组按奇偶性划分,不改变相对顺序

问题描述

给定一个数组,比如 arr = { 1, 3, 1, 4, 1, 5, 2, 0},对该数组进行整理,使得所有奇数都在前面,所有的偶数都在后面,且保证所有奇数的相对顺序不改变,所有偶数的相对顺序不改变。

问题解决

Solution1:T(n) = O(n^2), S(n) = O(1)

利用冒泡排序的思想,对数组进行整理即可。

思想:扫描数组,针对每个发现的奇数,都利用冒泡技术,往前移动该奇数,直到碰见了其他奇数。

Solution2:T(n) = O(n), S(n) = O(n)

如果空间复杂度达到S(n) = O(n),那么其实很简单:

  • 新建一个数组,保存顺序扫描到的奇数
  • 再次扫描原数组,在上述数组中保存扫描到的所有偶数
  • 然后把新数组的元素拷贝到原数组即可

Solution3:T(n) = O(n log n),S(n) = O(1)

针对数组利用分而治之的思想:

  • 对数组左半部分进行奇偶划分;
  • 对数组右半部分进行奇偶划分;
  • 现在数组的状态是:|奇数|偶数|奇数|偶数|,针对第二和第三部分,进行整体对调即可

对调的API:

void swap(vector<int> &arr, int i, int j, int k) {
    reverse(arr, i, j);
    reverse(arr, j+1, k);
    reverse(arr, i, k);
}

因此时间复杂度是: T(n) = T(n/2) + T(n/2) + O(n), 因此T(n) = O(n log n)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-10 04:12:48

对给定数组按奇偶性划分,不改变相对顺序的相关文章

HDU 4417 Super Mario ( 超级马里奥 + 主席树 + 线段树/树状数组离线处理 + 划分树 )

HDU 4417 - Super Mario ( 主席树 + 线段树/树状数组离线处理 + 划分树 ) 这道题有很多种做法,我先学习的是主席树.后面陆续补上线段树离线和划分树 题目大意就是给定一个区间给定一个数列,每次要求你查询区间[L,R]内不超过K的数的数量 主席树做法: 最基本的是静态第k大,这里是求静态的 <= K,差不多,在Query操作里面需要修改修改 先建立size棵主席树,然后询问的时候统计的是 第R棵主席树中[1,K]的数量 - 第L-1棵主席树中[1,K]的数量 注意这里下标

对给定数组进行反转

package cn.itcast.javase; public class Test06 { /** * 对给定数组进行反转 * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int arr[]={8,3,5,2,9,1}; print(arr); inversion(arr); print(arr); } private static void invers

给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X

题目:给定数组A,大小为n,现给定数X,判断A中是否存在两数之和等于X 思路一: 1,先采用归并排序对这个数组排序, 2,然后寻找相邻<k,i>的两数之和sum,找到恰好sum>x的位置,如果sum=x则返回true, 3,找到位置后,保持i不变,从k处向前遍历,直到找到A[k]+A[i]等于x,并返回TRUE,如果找不到,则返回false. 论证步骤3:当前找到的位置恰好A[k]+A[i]>x,且前一位置的sum<x: 所以A[i]前面的数(不包括A[i])无论取哪两个数都

给定数组a[N]构造数组b[N]

转自:http://blog.csdn.net/wumuzi520/article/details/7841280 给定一个数组a[N],我们希望构造数组b [N], 其中b[j]=a[0]*a[1]…a[N-1] / a[j], 在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度: 除遍历计数器与a[N] b[N]外,不可使用新的变量 (包括栈临时变量.堆空间和全局静态变量等) 解析:设b[0]=1 由b[i]=b[i-1]*a[i-1]可得 b[1] = a[0] b

给定数组,去掉0元素后将剩下的元素赋给新的数组

编程实现给定数组,将数组中值为0的项去掉存入新的数组. package com.liaojianya.chapter1; /** * This program demonstrates the way to remove zero from old array and insert into new array. * @author LIAO JIANYA * 2016年7月21日 */ public class RemoveZero { public static void main(Stri

PHP求给定数组的组合

1.求给定数组的组合 如array('a', 'b', 'c') 结果为 a b c a b a c b c function combination($arr){ if(empty($arr)){ return false; } $count = count($arr); for($i=1; $i<$count; $i++){ combinationResult($arr, 0, $count, $i); } } function combinationResult($arr, $begin,

将回调函数作用到给定数组的单元上

-------------------------------------------------------------------------------------------------------- array array_map ( callable $callback , array $arr1 [, array $... ] ) array_map() 返回一个数组,该数组包含了 arr1 中的所有单元经过 callback 作用过之后的单元. callback 接受的参数数目应

python 给定数组任意组合等于一个定值的所有解

抛出问题: 求给定数组任意组合等于一个定值的所有解 例如列表l = [1, 2, 3, 4, 5],求任意组合的结果为10的所有答案 问题分析: 实际就是列表的所有排列组合,然后算出每个排列组合的值,记录等于所求值的组合结果. 代码实现就是先生成和 l 等长的全0列表,0表示,列表该位置数不取,1表示列表该位置数取,就这样一直递归,一直到全1 # -*- coding:utf-8 -*- # 日期:2018/6/11 7:30 # Author:小鼠标 # 求给定数组任意组合等于一个定值的所有解

【C语言】用指针数组完成:将若干字符串安字母顺序输出

//用指针数组完成:将若干字符串安字母顺序输出 #include <stdio.h> #include <string.h> void print(char * name[],int n) //char * name[],指针数组,每个数组元素是一个char*(即字符串)类型 { int i; for(i=0;i<n;i++) { printf("%s\n",name[i]); } } void sort(char *name[],int n) { cha