美文网首页
LintCode 31. 数组划分

LintCode 31. 数组划分

作者: Jay_8d33 | 来源:发表于2018-02-03 00:46 被阅读0次

原题

第一步,万年不变的查错。如果给的array是null或空,直接return 0

    public int partitionArray(int[] nums, int k) {
        if(nums == null || nums.length == 0) {
            return 0;
        }
        ...
    }

这道题很简单,简直对不起medium难度。分明就是quickSort的第一步嘛。总的来说,就是左右两个pointer,左边如果碰到大于等于k的,右边如果碰到小于k的,那么就左右互换。最后return那个,可能需要想一下,要求nums[index]必须大于等于k。这个while loop的结束条件就是左边超过右边,所以其实左边比右边大,所以最后要return left;
直接上完整的code了,没有难度。

public class Solution {
    /*
     * @param nums: The integer array you should partition
     * @param k: An integer
     * @return: The index after partition
     */
    public int partitionArray(int[] nums, int k) {
        if(nums == null || nums.length == 0) {
            return 0;
        }
        
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            while (left <= right && nums[left] < k) {
                left++;
            }
            
            while (left <= right && nums[right] >= k) {
                right --;
            }
            
            if (left <= right) {
                swap(nums, left, right);
            }
        }
        
        return left;
    }
    
    private void swap(int[] nums, int left, int right) {
        int temp = nums[left];
        nums[left] = nums[right];
        nums[right] = temp;
    }
}

分析

时间复杂度

只遍历了一次,所以O(n)。

空间复杂度

O(1)。

总的来说,太简单了。更简单的一种方法其实是一次遍历,数比k小的数字有几个,然后返回。如果真的面试碰到的话,应该不要傻傻的直接two pointer。应该先说最明显也是最简单的答案,然后等人家followup。

相关文章

  • LintCode 31. 数组划分

    原题 解 第一步,万年不变的查错。如果给的array是null或空,直接return 0 这道题很简单,简直对不起...

  • lintcode 数组划分

    给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得:所有小于k的元素移到...

  • OJ lintcode 链表划分

    给定一个单链表和数值x,划分链表使得所有小于x的节点排在大于等于x的节点之前。你应该保留两部分内链表节点原有的相对...

  • 数组划分

    给出一个整数数组 nums 和一个整数 k。划分数组(即移动数组 nums 中的元素),使得: 所有小于k的元素移...

  • 数组划分

    描述 样例 代码实现

  • 数组利用前缀和求子数组问题

    1、子数组之和https://www.lintcode.com/problem/subarray-sum/desc...

  • LintCode连续数组

    这个题目的名字翻译的不好,题意是: 给一个二进制数组,找到 0 和 1 数量相等的子数组的最大长度样例样例 1:输...

  • 最大子数组

    最大子数组(lintcode 41) 描述:给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。样例:给出...

  • lintcode 最大子数组||

    给定一个整数数组,找出两个 不重叠 子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。返回最大的...

  • lintcode 最大子数组|||

    给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续...

网友评论

      本文标题:LintCode 31. 数组划分

      本文链接:https://www.haomeiwen.com/subject/kgqsnxtx.html