• 数组划分


    题目描述:

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

    • 所有小于k的元素移到左边
    • 所有大于等于k的元素移到右边

    返回数组划分的位置,即数组中第一个位置 i,满足 nums[i] 大于等于 k

     注意事项

    你应该真正的划分数组 nums,而不仅仅只是计算比 k 小的整数数,如果数组 nums 中的所有元素都比 k 小,则返回 nums.length。

    样例

    给出数组 nums = [3,2,2,1] 和 k = 2,返回 1.

    解法1:直接sort排序,然后查找。

    解法2:利用快排的思想,小于k的数依次移到前面位置。从p=0位置开始,每次遇见小于k的数都移动到p位置。返回p+1。

    附代码:

    // 解法2: 利用快排的思想,小于k的数依次移到前面位置
    class Solution {
    public:
        int partitionArray(vector<int> &nums, int k) {
            // write your code here
            int p = 0;
            for (int i=0; i<nums.size(); ++i) {
                if (nums[i] < k) {
                    swap(nums[i], nums[p]);
                    p++;
                }
            }
            return p;
        }
    };
    

    解法3:依然是快排的思想,两个指针,l+1表示之前的全是<K的数,r+1表示之前的数全是<K的数。每次交换nums[l+1]和nums[r+1]。

    附代码:

    // 解法3: 两个指针,l:nums[i+1]>=k nums[i] < k,nums[j]>=k
    class Solution {
    public:
        int partitionArray(vector<int> &nums, int k) {
            // write your code here
            int l = -1, r = -1;
            int n = nums.size();
            if (n == 0) return 0;
            while(l <= r) {
                while(nums[l+1] < k && l < n-1) l += 1;
                r = l;
                while(nums[r+1] >= k && r < n-1) r += 1;
                if (l >= n-1 || r >= n-1) break;
                if (nums[l+1] >= k) {
                    swap(nums[l+1], nums[r+1]);
                }
            }
           if (l >= n) return n;
           return l + 1;
        }
    };
    

     参考链接:

    快速排序算法:http://blog.csdn.net/v_july_v/article/details/6116297

  • 相关阅读:
    git clone 解决Permission Denied (publickey)问题
    json-server 的基本使用
    存储过程的基本使用(1)
    Linux中的yum是什么?如何配置?如何使用?
    搭建博客园皮肤
    PSCP和SCP区别和用法
    Linux 磁盘分区和挂载
    win10产生文件的哈希值
    linux下刻录iso到U盘
    jquery鼠标移入移出
  • 原文地址:https://www.cnblogs.com/icode-girl/p/6336707.html
Copyright © 2020-2023  润新知