LeetCode.11-20

LeetCode 11. 盛最多水的容器

class Solution {
public:
    int maxArea(vector<int>& height) {
        int res = 0;
        for(int i=0,j = height.size()-1;i<j;) {
            res = max(res, min(height[i],height[j])*(j-i));
            if(height[i]>height[j]) j--;
            else i++;
        }
        return res;
    }
};

LeetCode 12. 整数转罗马数字

class Solution {
public:
    string intToRoman(int num) {
        int values[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        string signs[] = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};

        string res;
        for(int i=0;i<13;i++) {
            while(num>=values[i]) {
                num-=values[i];
                res+=signs[i];
            }
        }

        return res;
    }
};

LeetCode 13. 罗马数字转整数

class Solution {
public:
    int romanToInt(string s) {
        unordered_map<char, int> hash;
        hash['I'] = 1, hash['V'] = 5;
        hash['X'] = 10, hash['L'] = 50;
        hash['C'] = 100, hash['D'] = 500;
        hash['M'] = 1000;

        int res = 0;
        for (int i = 0; i < s.size(); i ++ ) {
            if (i + 1 < s.size() && hash[s[i]] < hash[s[i + 1]])
                res -= hash[s[i]];
            else
                res += hash[s[i]];
        }

        return res;
    }
};

LeetCode 14. 最长公共前缀

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string res;
        if(strs.empty()) return res;

        for(int i=0;;i++) {
            if(i>=strs[0].size()) return res;
            char c = strs[0][i];
            for(auto str : strs) {
                if(str.size()<i||str[i]!=c)
                    return res;
            }
            res+=c;
        }

        return res;
    }
};

LeetCode 15. 三数之和

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int> > res;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++) {
            if(i&&nums[i]==nums[i-1]) continue;
            for(int j = i+1, k = nums.size()-1; j<k ; j++) {
                if(j > i+1 && nums[j] == nums[j-1]) continue;
                while(j < k-1 && nums[i] + nums[j] + nums[k-1] >= 0) k--;
                if(nums[i] + nums[j] + nums[k] == 0) {
                    res.push_back({nums[i],nums[j],nums[k]});
                }
            }
        }
        return res;
    }
};

LeetCode 16. 最接近的三数之和

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        pair<int,int> res(INT_MAX,INT_MAX);
        for(int i=0;i<nums.size();i++)
            for(int j = i+1, k = nums.size()-1; j<k ; j++) {
                while(j<k-1 && nums[i]+nums[j]+nums[k-1]>=target) k--;
                int sum = nums[i] + nums[j] + nums[k];
                res = min(res, make_pair(abs(sum-target),sum));
                if(j < k-1) {
                    sum = nums[i] + nums[j] + nums[k-1];
                    res = min(res, make_pair(targeat-sum,sum));
                }
            }

        return res.second;
    }
};

LeetCode 17. 电话号码的字母组合

class Solution {
public:
    vector<string> ans;
    string strs[10] = {
        "", "", "abc", "def",
        "ghi", "jkl", "mno",
        "pqrs", "tuv", "wxyz"
    };
    vector<string> letterCombinations(string digits) {
        if(digits.empty()) return ans;
        dfs(digits,0,"");
        return ans;
    }
    void dfs(string &digits, int u, string path) {
        if(u == digits.size()) ans.push_back(path);
        else {
            for(auto c : strs[digits[u]-'0']) 
                dfs(digits, u+1, path+c);
        }
    }
};

LeetCode 18. 四数之和

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        vector<vector<int>> res;
        for (int i = 0; i < nums.size(); i ++ ) {
            if (i && nums[i] == nums[i - 1]) continue;
            for (int j = i + 1; j < nums.size(); j ++ ) {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                for (int k = j + 1, u = nums.size() - 1; k < u; k ++ ) {
                    if (k > j + 1 && nums[k] == nums[k - 1]) continue;
                    while (u - 1 > k && (long long)nums[i] + (long long)nums[j] + (long long)nums[k] + (long long)nums[u - 1] >= target) u -- ;
                    if ((long)nums[i] + (long)nums[j] + (long long)nums[k] + (long long)nums[u] == target) {
                        res.push_back({nums[i], nums[j], nums[k], nums[u]});
                    }
                }
            }
        }

        return res;
    }
};

LeetCode 19. 删除链表的倒数第N个节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int k) {
        auto dummy = new ListNode(-1);
        dummy->next = head;
        int n = 0;
        for(auto p = dummy; p ; p = p->next) n++;
        auto p = dummy;
        for(int i=0;i<n-k-1;i++) p = p->next;
        p->next = p->next->next;

        return dummy->next;
    }
};

LeetCode 20. 有效的括号

class Solution {
public:
    bool isValid(string s) {
        stack<char> st;
        for(auto c : s) {
            if(c == '(' || c == '[' || c == '{') 
                st.push(c);
            else {
                if(st.size() && abs(st.top() - c) <= 2) st.pop();
                else return false;
            }
        }
        return st.empty();
    }
};c
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿炳的旅程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值