#31 Partition Array

题目描述:

Given an array nums of integers and an int k, partition the array (i.e move the elements in "nums") such that:

  • All elements < k are moved to the left
  • All elements >= k are moved to the right

Return the partitioning index, i.e the first index i nums[i] >= k.

 Notice

You should do really partition in array nums instead of just counting the numbers of integers smaller than k.

If all elements in nums are smaller than k, then return nums.length

Example

If nums = [3,2,2,1] and k=2, a valid answer is 1.

Challenge 

Can you partition the array in-place and in O(n)?

题目思路:

这题也可以用two pointers的想法,l和r指针一个在头,一个在尾,i从0....r遍历,如果nums[i] < k,就l和i上的值交换;反之,则让r和i上的值交换。这里要注意的是,r换给i的值可能是个< k的东西,这种情况下,需要再和l换一次。

Mycode(AC = 13ms):

class Solution {
public:
    int partitionArray(vector<int> &nums, int k) {
        // write your code here
        if (nums.size() == 0) return 0;
        
        int l = 0, r = nums.size() - 1;
        for (int i = 0; i <= r; i++) {
            // swap left and index if nums[i] < k
            if (nums[i] < k) {
                swap(nums, i, l);
                l++;
            }
            // swap right and index if nums[i] < k
            else {
                swap(nums, i, r);
                // it is possible that the original
                // nums[r] is smaller than k, in that
                // case, should do another swap between
                // l and old i
                if (nums[i] < k) i--;
                r--;
            }
        }
        
        return l;
    }
    
    void swap(vector<int> &nums, int i, int j) {
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
};


阅读更多
版权声明:三千微尘里,吾宁爱与憎 https://blog.csdn.net/haifischxia/article/details/52351442
文章标签: lintcode two pointers
个人分类: lintcode
上一篇#32 Minimum Window Substring
下一篇#30 Insert Interval
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭