in-place题小结

最近做了LeetCode上的两道题,题面不难,但是要求实现in-place实现,也就是O(1)的空间复杂度还是需要有点技巧。

LeetCode 75.Sort Colors 要求在O(1)的空间复杂度内one-pass实现数组内的0、1、2的排序。

 void sortColors(vector<int>& nums) {
        if (nums.size() == 0) return;
        int i = -1,j = -1,k = -1;
        for (int m = 0; m < nums.size(); ++m) {
            if (nums[m] == 0) {
                nums[++k] = 2;
                nums[++j] = 1;
                nums[++i] = 0;
            } else if (nums[m] == 1) {
                nums[++k] = 2;
                nums[++j] = 1;
            } else if (nums[m] == 2) {
                nums[++k] = 2;
            } else break;
        }
    }

LeetCode 844.Backspace String Compare 实现带有“#”的两个字符串匹配问题,“#”表示将前一个字符删除。

void removeBackspaces(string& str) {
        const int size = str.size();
        int w = 0;
        for (int r = 0; r < size; ++r) {
            if (str[r] != '#') {
                str[w] = str[r];
                ++w;
            } else {
                if (--w < 0) w = 0;             
            }
        }
        str.resize(w);
    }
    bool backspaceCompare(string S, string T) {
        removeBackspaces(S);
        removeBackspaces(T);
        return (S == T);
    }

此外还联想到快排中的Partition函数,可以在in-place中实现数组中任意一个元素左边比它小,右边比它大。

int Partition(vector<int>& nums,int l,int r) {
    srand (time(NULL));
    int index = rand()%(r - l + 1) + l;
    cout << nums[index] << endl;
    int small = -1;
    swap(nums[index],nums[r]);
    for (int i = l; i < r; ++i) {
        if (nums[i] < nums[r]) {
            small++;
            if (small != i) swap(nums[small],nums[i]);
        }
    }
    small++;
    swap(nums[small],nums[r]);
    return small;
}

这三道题提醒我们处理这种题要有in-place和one-pass的思路,精益求精

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值