Leetcode 101刷题记录(3)

167.两数之和

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int in1 = 0,in2 = numbers.size() - 1;
        for(;;){
            if(numbers[in1] + numbers[in2] > target)
                in2--;
            else if(numbers[in1] + numbers[in2] < target)
                in1++;
            else if(numbers[in1] + numbers[in2] == target)
                break;
        }
        return vector<int>{in1 + 1,in2 + 1};
    }
};

命两指针从两边开始遍历求和,直到找到题解

88.合并两个有序数组

class Solution {
public:
    void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
        int pos = m-- + n-- - 1;
        for(;;){
            if(m < 0||n < 0)
                break;
            if(nums2[n] >= nums1[m])
                nums1[pos--] = nums2[n--];
            else 
                nums1[pos--] = nums1[m--];
        }
        while(n >= 0){
            nums1[pos--] = nums2[n--];
        }
    }
};

命两指针从尾部开始插入数据。因为题目要求不能开辟新空间来使用,就必须只能在原来提供的两个数组里进行相关操作

142.环形链表

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode *detectCycle(ListNode *head) {
        ListNode* fast = head;
        ListNode* slow = head;
        do{
            if(!fast || !fast->next)
                return nullptr;
            fast = fast->next->next;
            slow = slow->next;
        }while(fast != slow);
        fast = head;
        while(fast != slow){
            fast = fast->next;
            slow = slow->next;
        }
        return fast;
    }
};

对于此题,需要使用到快慢指针法:
1)命两指针 fast 与 slow,前者每次走两步,后者每次走一步。如果fast指针一直走不到尽头则说明链表中无环。
2)反之,如果两指针相遇,说明链表中存环。这时将fast指针重新移至开头,速度并降至一次一步。下次与slow相遇的地点就是环的开头

76.最小覆盖子串

class Solution {
public:
    string minWindow(string s, string t) {
        vector<int>chars(128,0);
        vector<bool>flag(128,false);
        if(t.empty() || s.empty())
            return "";
        int size1 = t.size();
        int size2 = s.size();
        for(int i = 0;i < size1;i++ ){
            flag[t[i]] = 1;//标记字母是否出现 
            chars[t[i]]++;//标记字母出现次数
        }
        int cnt = 0;//记录t在s中的出现情况
        int l = 0;
        int minl = 0;
        int minsize = size2 + 1;
        for(int i = 0;i < size2;i++){
            if(flag[s[i]])
                if(--chars[s[i]] >= 0)//if(flag[s[i]] && chars[s[i]]) cnt++;chars[s[i]]--;
                    cnt++;
            while(cnt == size1){//当记录中子串满足覆盖条件后,开始缩小区间
                if(i - l + 1 < minsize){//i - l是窗口区间
                    minl = l;
                    minsize = i - l + 1;
                }
                if(flag[s[l]] && ++chars[s[l]] > 0 ){
                    cnt--;
                }
                l++;
            }
        }
        if(minsize > size2)
            return "";
        else 
            return s.substr(minl,minsize);
    }
};

注意返回空字符串的形式是""

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值