查看: 1490| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

[二分/排序/搜索] 关于 PartitionArray

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
最近在研究quick sort, 其中关键步骤需要 PartitionArray. 但是发现网上的两头指针算法似乎是有问题的。。代码如下:
public class Solution {
    public int[] partitionArray(int[] nums, int k) {
        if(nums == null || nums.length == 0){
            return nums;
        }

        int left = 0, right = nums.length - 1;
        while (left <= right) {

            while (left <= right && nums[left] < k) {
                left++;
            }

            while (left <= right && nums[right] >= k) {
                right--;
            }

            if (left <= right) {
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;

                left++;
                right--;
            }
        }
        return nums;
    }
}
设计思路很巧妙,从两边找,符合条件往下跳,不符合就等着两边不符合然后交换。。可是如果取的那个刚好是最小值呢并且左边递减右边递增呢?
let nums = (9,8,7,6,3,4,5,8,9); k = 3;
很明显出来的结果不对,网上清一色给的优化方法都是这种两头推进的方法。。是我误解了题目意思还是这种解法真有问题呢?



上一篇:【求教】basic calculator之疯狂follow up
下一篇:LRU Cache
🔗
oily 2017-1-10 04:51:41 | 只看该作者
全局:
怎么很明显出来结果不对了。。。
回复

使用道具 举报

🔗
jijunyan 2017-1-10 05:12:04 | 只看该作者
全局:
oily 发表于 2017-1-10 04:51
怎么很明显出来结果不对了。。。

987634589, k = 3; 一路都 right-- 出来还是987634589,不是说小于3的要放到3的左边嘛。。
回复

使用道具 举报

🔗
stellari 2017-1-10 09:38:49 | 只看该作者
全局:
首先,你贴的这段代码的逻辑是“所有>=k的元素要出现在<k的右面”,所以最后的结果忠实地体现了这个前提:在结果9,8,7,6,3,4,5,8,9中,所有>=k的元素(即全部元素)确实是出现在了<k的元素(并不存在)的“右面”。

这个前提并不是太好。因为如果k正好等于min(nums),那么就可能会出现你所说的这种情况。这种情况下,并没有真正把数组分成两部分。所以如果算法恰好又不能自适应地改变k的话,那么就会一直卡死在这一步,直至耗尽资源。

正确的分割逻辑应该是“所有<=k的元素要出现在>k元素的左边”。这样就算k是最小值,那么也能保证它在partition之后能够位于数组的最左边。这样就还是可以把数组分成[最小值 | 剩余元素] 两个部分。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表