2022-10-9 周记 0x001

· Life

Algorithm

LC 4. 寻找两个正序数组的中位数

分析:
    nums1: xxx X xxx
    nums2: yyy Y yyyyy
    在两个数组里找第k/2个数
    当X<Y时,说明第k个数一定不在数组nums1[start,k/2]里,因为nums1[start,k/2]有个k/2个数都小于Y,加上nums2[start,k/2 - 1]的个数才有k-1个数。
    同理当Y<X时
细节:
    k分配不一定均匀,nums1数组元数可能不够k/2
    写个函数findKth(nums1, nums2, i, j, k)
    确保nums1里元数个数 < nums2里元数个数
    当左边数组遍历完了(i==nums1.size()) 返回nums2中的第k个数
    当k==1时返回两个数组里的最小值
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size() + nums2.size();
        if (n % 2 == 0) {
            return (findKth(nums1, nums2, 0, 0, n / 2)
                    + findKth(nums1, nums2, 0, 0, n / 2 + 1)) / 2.0;
        } else {
            return findKth(nums1, nums2, 0, 0, n / 2 + 1);
        }
    }
 
    int findKth(vector<int> &nums1, vector<int> &nums2, int i, int j, int k) {
        if (nums1.size() - i > nums2.size() - j) {
            return findKth(nums2, nums1, j, i, k);
        }
        if (i == nums1.size()) return nums2[j + k - 1];
        if (k == 1) return std::min(nums1[i], nums2[j]);
        int k1 = std::min((int)nums1.size() - i, k / 2);
        int k2 = k - k1;
        if (nums1[i + k1 - 1] < nums2[j + k2 - 1]) {
            return findKth(nums1, nums2, i + k1, j, k2);
        } else {
            return findKth(nums1, nums2, i, j + k2, k1);
        }
    }
};

Review

Simple Go project layout with modules

Link 了解内部包,导出包,命令行程序包。

Tip

Better Code: 更好的异常日志打印

Link

解决 vscode 安装 go 插件失败问题

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

重启 vscode, install all。

Share

征集你所知道的 Rust 学习资料、上手项目、玩具/工具、落地场景等

Link

Comments (0)

    Send comment

    Markdown supported. Please keep comments clean.