LintCode 数组划分
2015-10-03 21:06
316 查看
数组划分
给出一个整数数组nums和一个整数k。划分数组(即移动数组nums中的元素),使得:
所有小于k的元素移到左边
所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置i,满足nums[i]大于等于k。
样例
给出数组nums=[3,2,2,1]和 k=2,返回 1
注意
你应该真正的划分数组nums,而不仅仅只是计算比k小的整数数,如果数组nums中的所有元素都比k小,则返回nums.length。
挑战
要求在原地使用O(n)的时间复杂度来划分数组
solution:
方法一:一种比较简单直接的方法就是相对nums排序,然后查找第一个大于等于K的元素的索引
方法二:保持两个前后索引 i 和 j , 其中 i <= j, nums[i] < k and nums[j] >= k; 否则就交换这个元素
给出一个整数数组nums和一个整数k。划分数组(即移动数组nums中的元素),使得:
所有小于k的元素移到左边
所有大于等于k的元素移到右边
返回数组划分的位置,即数组中第一个位置i,满足nums[i]大于等于k。
样例
给出数组nums=[3,2,2,1]和 k=2,返回 1
注意
你应该真正的划分数组nums,而不仅仅只是计算比k小的整数数,如果数组nums中的所有元素都比k小,则返回nums.length。
挑战
要求在原地使用O(n)的时间复杂度来划分数组
solution:
方法一:一种比较简单直接的方法就是相对nums排序,然后查找第一个大于等于K的元素的索引
class Solution { public: int partitionArray(vector<int> &nums, int k) { // write your code here sort(nums.begin(), nums.end()); for (int i = 0; i < nums.size(); ++i) { if (nums[i] >= k) return i; } return nums.size(); } };
方法二:保持两个前后索引 i 和 j , 其中 i <= j, nums[i] < k and nums[j] >= k; 否则就交换这个元素
class Solution { public: int partitionArray(vector<int> &nums, int k) { // write your code here int i = 0, j = nums.size()-1; while (i <= j) { while(i <= j && nums[i] < k) ++i; while(i <= j && nums[j] >= k) --j; if (i <= j) { swap(nums[i], nums[j]); ++i; --j; } } return i; } private : inline void swap(int &a, int &b) { a ^= b; b ^= a; a ^= b; } };
相关文章推荐
- GeoHash解析及java实现
- 内心长大
- c语言面试之字符串
- POJ 2082 Terrible Sets
- 单例Singleton
- Log4j官方文档翻译(五、日志输出的方法)
- 多进程和多线程的优缺点
- 第六篇 Replication:合并复制-发布
- fedora 键盘键位布局 layout
- sqlite3数据库的基本操作
- vector
- ViewController详解
- 春天该吃的时令菜 春季时令菜谱_
- iOS图文攻略之UILabel属性
- oracle临时表-优化查询速度
- Linux下crontab命令的使用笔记
- 将输入流(InputStream)转换为位图(Bitmap)
- 链表002
- OP趋势系统
- UVA 439 Knight Moves(BFS)