leetcode腾讯50-43,-46-53

43. 字符串相乘

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

class Solution {

public:

    string multiply(string num1, string num2) {

        //参考做法,由个位开始计算相加,O(n2)

        int m=num1.length(),n=num2.length();

        vectorres(m+n,0);

        for(int i=m-1;i>=0;i--)

        {

            for(int j=n-1;j>=0;j--)

            {

                int temp=res[i+j+1]+(int)(num1[i]-'0')*(num2[j]-'0');

                res[i+j+1]=temp%10;

                res[i+j]+=temp/10;

            }

        }

        string s="";

        int st=0;

        while(st

        {

            st++;

        }

        for(int i=st;i

        {

            s+=(res[i]+'0');

        }

        return (s.length()==0)?"0":s;

    }

};

46. 全排列

给定一个 没有重复数字的序列,返回其所有可能的全排列。

class Solution {

public:

    vector>res;

    vectorpath;

    vector> permute(vector& nums) {

        vectorused_i(nums.size(),false);

        int num=0;

        dfs(nums,0,num,used_i);

        return res;

    }

    void dfs(vector&nums,int s,int& n,vector&used)

    {//s表示正在访问的节点序号,n表示已访问节点个数

        if(n==nums.size()){

            res.push_back(path);

            return;

        }

        for(int i=0;i

        {

            if(used[i])continue;

            used[i]=true;

            n++;

            path.push_back(nums[i]);

            dfs(nums,i+1,n,used);

            used[i]=false;

            n--;

            path.pop_back();

        }

    }

};

53. 最大子序和

给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

class Solution {

public:

    int maxSubArray(vector& nums) {

        //动态规划:[i]结尾的最大连续子数组和=max(以[i-1]数字结尾的的连续子数组和+nums[i],nums[i])

        int  sum=0,Maxsum=nums[0],n=nums.size();

        for(int i=0;i

        {

           sum=(nums[i]>=nums[i]+sum)?nums[i]:nums[i]+sum;

           Maxsum=(Maxsum>=sum)?Maxsum:sum;   

        }

        return Maxsum;

    }

};

你可能感兴趣的:(leetcode腾讯50-43,-46-53)