美文网首页
Day9 把数组排成最小的数+树的子结构+和为s的连续正数序列

Day9 把数组排成最小的数+树的子结构+和为s的连续正数序列

作者: 吃掉夏天的怪物 | 来源:发表于2021-06-21 11:21 被阅读0次

TODO:

  1. 仔细再做一遍把数组排成最小的数(sort(strs.begin(), strs.end(), [](string& x, string& y){ return x + y < y + x; });)
  2. 重做树的子结构
  3. 稍微回顾一下和为s的连续正数序列

一、剑指 Offer 45. 把数组排成最小的数(中等)

拼凑出来的位数都一样,就觉得可能按照桶排序再链接起来就是答案。
但是这样还得遍历每个数字时间复杂度就会很高。
于是就又看了题解,将x < y,定义为x该排y的右边,再用快排(很有意思!⭐)/内置排序 对数字们进行排序最后组合起来。

方法一 内置函数:

class Solution {
public:
    string minNumber(vector<int>& nums) {
        vector<string> strs;
        string res;
        for(int i = 0; i < nums.size(); i++)
            strs.push_back(to_string(nums[i]));
        sort(strs.begin(), strs.end(), [](string& x, string& y){ return x + y < y + x; });
        for(int i = 0; i < strs.size(); i++)
            res.append(strs[i]);
        return res;
    }
};

方法二 快排:

class Solution {
public:
    string minNumber(vector<int>& nums) {
        if(nums.size() == 0) return "";
        vector<string> strs;
        for(auto it:nums){
            strs.push_back(to_string(it));
        }
        quickSort(strs,0,nums.size()-1);
        string ans;
        for(auto it:strs){
            ans.append(it);
        }
        return ans;
    }
    void quickSort(vector<string>& strs,  int l, int r){
        if(l >= r) return ;
        int i = l;
        int j = r;
        while(i < j){
            while(((strs[j]+strs[l]) >= (strs[l]+strs[j]) )&& i <j) j--;
            while(((strs[i]+strs[l]) <= (strs[l] +strs[i])) && i <j) i++;
            swap(strs[i],strs[j]);
        }
        swap(strs[l],strs[i]);
        quickSort(strs,l,i-1);
        quickSort(strs,i+1,r);
    }
};

二、剑指 Offer 26. 树的子结构(中等)

😭 写了好久好久好久!!
要先想清楚再写,① 空子树不为任何子树的子树 ②探究B是否为A的子树时,首先在A中找出与B根相同的结点,再进行递归判断。
这道题做错好多遍说明对递归还是掌握的不好。

class Solution {
public:
    bool recur(TreeNode* A, TreeNode* B){
        if(A ==nullptr && B == nullptr) return true;
        if(A == nullptr) return false;
        if(B == nullptr) return true;
        if(B->val != A->val) return false;
        return  recur(A->left,B->left) && recur(A->right,B->right);
    }
    bool isSubStructure(TreeNode* A, TreeNode* B) {
        if(B == nullptr || A==nullptr) return false;
        return ((A->val == B->val) && recur(A,B)) || isSubStructure(A->left,B) || isSubStructure(A->right,B) ;

    }
};

三、 剑指 Offer 57 - II. 和为s的连续正数序列(简单)

以为不会做结果还是能写出来,开心😊

class Solution {
public:
    void save(vector<vector<int>>& res, int small, int big){
        vector<int> temp(big - small + 1);
        for(int j = 0, i = small; i <= big; i++,j++){
            temp[j] = i; 
        }
        res.emplace_back(temp);
    }
    vector<vector<int>> findContinuousSequence(int target) {
        if(target < 3) return {};
        int small = 1;
        int big = 2;
        int sum = 3;
        vector<vector<int>> res;
        while(small < big && big < target){
            if(sum  == target) {save(res,small,big); sum-=small; small+=1;}
            else if(sum < target) {big+=1; sum+=big;}
            else if(sum > target) {sum-=small;small+=1;}
        }
        return res;

    }
};

相关文章

  • Day9 把数组排成最小的数+树的子结构+和为s的连续正数序列

    TODO:仔细再做一遍把数组排成最小的数(sort(strs.begin(), strs.end(), [](st...

  • 【数组】和为S的连续正数序列

  • Java日记2018-05-20

    第一题 和为 S 的连续正数序列 输出所有和为 S 的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从...

  • 11-15题

    11、和为S的连续正数序列输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序...

  • 和为s的连续整数序列

    找出所有和为S的连续正数序列输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

  • 面试题57_2:和为S的连续正数序列

    和为s的连续正数序列 输入一个正数s,打印出所有何为s的连续正数序列(至少含有两个数)。 例如输入15,由于1+2...

  • 4.7 双指针问题(1)

    方法 暂无 注意点 暂无 目录 和为S的连续正数序列(很经典) 和为S的连续正数序列 小明很喜欢数学,有一天他在做...

  • 剑指offer 41-45

    41.和为S的连续正数序列 这个题最直观的想法就是从1,2开始用枚举法算出所有的连续正数序列的和,直到第一个数和第...

  • 和为S的连续正数序列

    题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不...

  • 和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并...

网友评论

      本文标题:Day9 把数组排成最小的数+树的子结构+和为s的连续正数序列

      本文链接:https://www.haomeiwen.com/subject/gensyltx.html