排序算法刷题【leetcode:04题,寻找两个正序数组的中位数。leetcode:219题,存在重复的元素 】

代码如下所示:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


/* leetcode04题:寻找两个正序数组的中位数 */
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int L1 = nums1.size(), L2 = nums2.size(), p1 = 0, p2 = 0, p3 = 0;
        vector<int> nums(L1 + L2);
        while (p1 < L1 || p2 < L2)
        {
            if (p1 == L1 || p2 != L2 && (nums1[p1] >= nums2[p2]))
            {
                nums[p3++] = nums2[p2++];
            }else {
                nums[p3++] = nums1[p1++];
            }
        }
        p1 = (L1 + L2) / 2, p2 = (L1 + L2) / 2;
        if ((L1 + L2) % 2 == 0) p1--;
        double ret = (nums[p1] + nums[p2]) / 2.0;
        return ret;
    }
};

void test()
{
    vector<int> v1, v2;
    v1.push_back(1);
    v1.push_back(3);
    v2.push_back(2);
    Solution s1;
    double ret = s1.findMedianSortedArrays(v1, v2);
    cout << "ret:" << ret;
}


/* leetcode219题:存在重复的元素 */
class Solution {
public:
    bool containsNearbyDuplicate(vector<int>& nums, int k) {
        vector<int> index;
        for (int i = 0; i < nums.size(); i++) index.push_back(i);
        sort(index.begin(), index.end(), [&](int i, int j)->bool {
            if (nums[i] != nums[j]) return nums[i] < nums[j];   //数组元素不相等,按照数组元素的大小排序
            return i < j; });   //数组元素相等按照数组下标从小到达排序
       
        for (int i = 1; i < nums.size(); i++)     //排序之后,数组相邻元素肯定挨边
        {
            if (nums[index[i - 1]] != nums[index[i]]) continue;
            if (index[i] - index[i - 1] <= k) return true;
        }
        return false;
    }
};

void test()
{
    vector<int> arry;
    for (int i = 1; i < 4; i++)  arry.push_back(i);
    for (int i = 1; i < 4; i++)  arry.push_back(i);
    Solution s1;
    s1.containsNearbyDuplicate(arry, 2);

}

int main()
{
    test();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值