算法学习——LeetCode力扣补充篇14(179. 最大数、43. 字符串相乘、32. 最长有效括号、543. 二叉树的直径、113. 路径总和 II)

算法学习——LeetCode力扣补充篇14

在这里插入图片描述

179. 最大数

179. 最大数 - 力扣(LeetCode)

描述

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

示例

示例 1:

输入:nums = [10,2]
输出:“210”

示例 2:

输入:nums = [3,30,34,5,9]
输出:“9534330”

提示

1 <= nums.length <= 100
0 <= nums[i] <= 109

代码解析

class Solution {
public:
    static bool cmp( string &s1 , string &s2 )
    {
        string tmp1 , tmp2;
        tmp1 = s1 + s2;
        tmp2 = s2 + s1;

        return tmp1 > tmp2;
    }
    string largestNumber(vector<int>& nums) {
        vector<string> tmpStr;
        string result;

        for(int i=0 ; i<nums.size() ; i++)
        {
            string tmp = to_string(nums[i]);
            tmpStr.push_back(tmp);
        }

        sort(tmpStr.begin() , tmpStr.end() , cmp);

        for(int i=0 ; i<tmpStr.size() ; i++)
        {
            result += tmpStr[i];
        }
        if(result[0] == '0') return "0";
        return result;
    }
};

43. 字符串相乘

43. 字符串相乘 - 力扣(LeetCode)

描述

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例

示例 1:

输入: num1 = “2”, num2 = “3”
输出: “6”

示例 2:

输入: num1 = “123”, num2 = “456”
输出: “56088”

提示

1 <= num1.length, num2.length <= 200
num1 和 num2 只能由数字组成。
num1 和 num2 都不包含任何前导零,除了数字0本身。

代码解析

class Solution {
public:
    string multiply(string num1, string num2) {
        if(num1 == "0" || num2 == "0") return "0";
        
        vector<vector<int>> tmp_nums; 
        vector<int> path;
        int add = 0, num_0 = 0 , cur_num = 0;
        int max_bit = 0;
        for(int i=num1.size()-1 ; i>=0 ; i--)
        {
            path.clear();
            add = 0;
            num_0 = num1.size()-1 - i;
            while(num_0--) path.push_back(0);
            for(int j=num2.size()-1 ; j>=0 ; j--)
            {
                cur_num = (num1[i] - '0') * (num2[j] - '0')  + add;
                path.push_back(cur_num %10);
                add = cur_num/10;
            }
            if(add != 0 ) path.push_back(add);
            if(path.size() > max_bit) max_bit = path.size();
            tmp_nums.push_back(path);
        }

        string result;
        add = 0;
        for(int i=0 ; i<max_bit ; i++)
        {
            cur_num = 0;
            for(int j=0 ; j<tmp_nums.size();j++)
            {
                if(tmp_nums[j].size() > i)
                {
                    cur_num += tmp_nums[j][i];
                }
            }
            cur_num += add;
            result += (cur_num )%10 + '0';
            add = (cur_num )/10;
            
        }
        if(add != 0) result += add + '0'; 
        reverse(result.begin() , result.end());
        return result;
       
    }
};

32. 最长有效括号

32. 最长有效括号 - 力扣(LeetCode)

描述

给你一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长有效(格式正确且连续)括号
子串
的长度。

示例

示例 1:

输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”

示例 2:

输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”

示例 3:

输入:s = “”
输出:0

提示

0 <= s.length <= 3 * 104
s[i] 为 ‘(’ 或 ‘)’

代码解析

class Solution {
public:
    int longestValidParentheses(string s) 
    {
        int maxans = 0;
        stack<int> stk;
        stk.push(-1);       //栈底最后一个没有被匹配的右括号的下标
        for (int i = 0; i < s.length(); i++) 
        {
            if (s[i] == '(')
            {
                stk.push(i);
            }
            else if (s[i] == ')')
            {
                stk.pop();
                if (stk.empty()) stk.push(i);
                else maxans = max(maxans, i - stk.top());
            }
        }
        return maxans;
    }
};

543. 二叉树的直径

543. 二叉树的直径 - 力扣(LeetCode)

描述

给你一棵二叉树的根节点,返回该树的 直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的 长度 由它们之间边数表示。

示例

示例 1:

在这里插入图片描述

输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。

示例 2:

输入:root = [1,2]
输出:1

提示

树中节点数目在范围 [1, 104] 内
-100 <= Node.val <= 100

代码解析

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int result = 0;
    int track_back(TreeNode* cur )
    {
        if(cur == nullptr)  return 0;
        int left_hight = track_back(cur->left) ;
        int right_hight =  track_back(cur->right) ;
        result = max(result , left_hight + right_hight + 1);
        return  max(left_hight , right_hight ) + 1;
    }
    int diameterOfBinaryTree(TreeNode* root) {
        
        track_back(root);
        return result-1 ;
    }
};

113. 路径总和 II

113. 路径总和 II - 力扣(LeetCode)

描述

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。

叶子节点 是指没有子节点的节点。

示例

示例 1:

在这里插入图片描述

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

示例 2:

在这里插入图片描述

输入:root = [1,2,3], targetSum = 5
输出:[]

示例 3:

输入:root = [1,2], targetSum = 0
输出:[]

提示

树中节点总数在范围 [0, 5000] 内
-1000 <= Node.val <= 1000
-1000 <= targetSum <= 1000

代码解析

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    int sum = 0;

    void track_back(TreeNode* cur , int &targetSum)
    {
        if(cur == nullptr) return;

        path.push_back(cur->val);
        sum += cur->val;
        if( sum == targetSum && cur->left == nullptr && cur->right == nullptr)
        {
            result.push_back(path);
        }
        track_back(cur->left , targetSum);
        track_back(cur->right , targetSum);
        sum -= cur->val;
        path.pop_back();
        return;
    }
    vector<vector<int>> pathSum(TreeNode* root, int targetSum) 
    {
        track_back(root,targetSum);
        return result;
    }
};

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 05:12:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 05:12:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 05:12:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 05:12:02       18 阅读

热门阅读

  1. VMware虚拟机ens33没有IP的解决办法

    2024-04-22 05:12:02       14 阅读
  2. c语言如何创建一个链表

    2024-04-22 05:12:02       14 阅读
  3. CTF 听说是rc4算法

    2024-04-22 05:12:02       10 阅读
  4. SQL约束

    SQL约束

    2024-04-22 05:12:02      11 阅读
  5. Oracle imp导入数据后中文乱码

    2024-04-22 05:12:02       14 阅读
  6. docker配置minio、redis、nacos

    2024-04-22 05:12:02       11 阅读
  7. Stable Diffusion,controlnet扩展

    2024-04-22 05:12:02       14 阅读
  8. C++ 随机数

    2024-04-22 05:12:02       11 阅读