C++ Leedcode刷题(日更)

目录

一、数组与双指针

1.两数之和

2.有序数组合并

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

一、数组与双指针

1.两数之和

C++ Leedcode刷题(日更)_第1张图片

暴力解法

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        int n = nums.size();
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (nums[i] + nums[j] == target) {
                    return {i, j};
                }
            }
        }
        return {};       
    }
};

 哈希解法

无序快速查找

class Solution {
public:
    vector twoSum(vector& nums, int target) {
        unordered_map  hashtable;  //建立无序哈希表
        for (int i=0; isecond,i};  //访问value  it->first访问key
            }
            hashtable[nums[i]] = i; //加入值 hashtable[key] = value
        }
        return {};
 
    }
};

2.有序数组合并

C++ Leedcode刷题(日更)_第2张图片

 暴力解法 :直接合并两个数组进行排序

但这种方法没有用到排序的特征

class Solution {
public:
    void merge(vector& nums1, int m, vector& nums2, int n) {
        for (int i=0; i

双指针

class Solution {
public:
    void merge(vector& nums1, int m, vector& nums2, int n) {
        int p1=0;
        int p2=0;
        int cur;
        int nums3[m+n]; //创建一个m+n的空数组
        while(p1

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

C++ Leedcode刷题(日更)_第3张图片

class Solution {
public:
    double findMedianSortedArrays(vector& nums1, vector& nums2) {
        int m = nums1.size();
        int n = nums2.size();
        int nums3[m+n];
        int p1=0;
        int p2=0;
        int cur;
        while( p1

4. 求三个数之和 

C++ Leedcode刷题(日更)_第4张图片

class Solution {
public:
    vector> threeSum(vector& nums) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        vector> ans;  #动态容器用来返回数组
        // 枚举 a
        for (int first = 0; first < n; ++first) {
            // 需要和上一次枚举的数不相同 去重
            if (first > 0 && nums[first] == nums[first - 1]) {
                continue;
            }
            // c 对应的指针初始指向数组的最右端
            int third = n - 1;
            int target = -nums[first];
            // 枚举 b
            for (int second = first + 1; second < n; ++second) {
                // 需要和上一次枚举的数不相同 去重
                if (second > first + 1 && nums[second] == nums[second - 1]) {
                    continue; //合理运用continue才能找全
                }
                // 需要保证 b 的指针在 c 的指针的左侧
                while (second < third && nums[second] + nums[third] > target) {
                    --third;
                }
                // 如果指针重合,随着 b 后续的增加
                // 就不会有满足 a+b+c=0 并且 b

 5. 颜色分类

 C++ Leedcode刷题(日更)_第5张图片

单指针 

两次循环遍历

class Solution {
public:
    void sortColors(vector& nums) {
        int n=nums.size();
        int ptr = 0;
        for (int i=0; i

双指针

一次循环遍历,需要注意用到while来避免,两个指针交换,只顾nums[n+1]而不管之前是否交换。

class Solution {
public:
    void sortColors(vector& nums) {
        int n=nums.size();
        int p1 = 0;
        int p2 = n-1;
        for (int i=0; i

 

你可能感兴趣的:(C++,数据结构)