剑指 Offer 41-50

剑指 Offer 42. 连续子数组的最大和

难度简单102收藏分享切换为英文关注反馈

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

 

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

 

提示:

  • 1 <= arr.length <= 10^5
  • -100 <= arr[i] <= 100
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int n=nums.size();
        vector<int> dp(n+1);
        dp[0]=nums[0];
        int maxn=dp[0];
        for(int i=1;i<=n-1;i++){
            dp[i]=max(dp[i-1]+nums[i],nums[i]);
            maxn=max(dp[i],maxn);
        }
        return maxn;
    }
};

剑指 Offer 43. 1~n整数中1出现的次数

难度中等74收藏分享切换为英文关注反馈

输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。

例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。

 

示例 1:

输入:n = 12
输出:5

示例 2:

输入:n = 13
输出:6

https://leetcode-cn.com/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solution/mian-shi-ti-43-1n-zheng-shu-zhong-1-chu-xian-de-2/

跳过不会  哭

剑指 Offer 44. 数字序列中某一位的数字

难度中等53收藏分享切换为英文关注反馈

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。

 

示例 1:

输入:n = 3
输出:3

示例 2:

输入:n = 11
输出:0
跳过 无语

剑指 Offer 45. 把数组排成最小的数

难度中等80收藏分享切换为英文关注反馈

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

 

示例 1:

输入: [10,2]
输出: "102"

示例 2:

输入: [3,30,34,5,9]
输出: "3033459"
class Solution {
public:
    string minNumber(vector<int>& nums) {
// 把数字转成字符串
        vector<string>strs;
        string ans;
        for(int i = 0; i < nums.size(); i ++){
            strs.push_back(to_string(nums[i]));
        }
        sort(strs.begin(), strs.end(), [](string& s1, string& s2){return s1 + s2 < s2 + s1;});
        for(int i = 0; i < strs.size(); i ++)
            ans += strs[i];
        return ans;
    }
};

引用传递不需要调用构造函数去构造函数的局部变量

剑指 Offer 46. 把数字翻译成字符串

难度中等116收藏分享切换为英文关注反馈

给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。

 

示例 1:

输入: 12258
输出: 5
解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"

Picture1.png

class Solution {
public:
    int translateNum(int num) {
        string src = to_string(num);
        int p = 0, q = 0, r = 1;
        for (int i = 0; i < src.size(); ++i) {
            p = q; 
            q = r; 
            r = 0;
            r += q;
            if (i == 0) {
                continue;
            }
            auto pre = src.substr(i - 1, 2);
            if (pre <= "25" && pre >= "10") {
                r += p;
            }
        }
        return r;
    }
};

剑指 Offer 47. 礼物的最大价值

难度中等56收藏分享切换为英文关注反馈

在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?

 

示例 1:

输入: 
[
  [1,3,1],
  [1,5,1],
  [4,2,1]
]
输出: 12
解释: 路径 1→3→5→2→1 可以拿到最多价值的礼物
class Solution {
public:
    int maxValue(vector<vector<int>>& grid) {
        int n=grid.size();
        int m=grid[0].size();
        for(int i=1;i<n;i++){
            grid[i][0]+=grid[i-1][0];
        }
        for(int j=1;j<m;j++){
            grid[0][j]+=grid[0][j-1];
        }
        for(int i=1;i<n;i++){
            for(int j=1;j<m;j++){
                grid[i][j]=max(grid[i-1][j],grid[i][j-1])+grid[i][j];
            }
        }
        return grid[n-1][m-1];
    }
};

剑指 Offer 48. 最长不含重复字符的子字符串

难度中等70收藏分享切换为英文关注反馈

请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。

 

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

 

提示:

  • s.length <= 40000
class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        //滑动窗口
        unordered_map<char,int> window;
        int ans=0;
        int left=0,right=0;
        while(right<s.size()){
            char c=s[right];
            right++;
            window[c]++;
            //收缩
            while(window[c]>1){
                char b=s[left];
                left++;
                window[b]--;
            }
            ans=max(ans,right-left);
        }
        return ans;
    }
};

剑指 Offer 49. 丑数

难度中等56收藏分享切换为英文关注反馈

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

 

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

Picture1.png


// 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
class Solution {
public:
	int nthUglyNumber(int n) {
		vector<int> dp(n, 0);
		dp[0] = 1;
		int p2 = 0, p3 = 0, p5 = 0;
		for (int i = 1; i < n; i++) {
			dp[i] = min(min(dp[p2] * 2, dp[p3] * 3), dp[p5] * 5);
			if (dp[i] == dp[p2] * 2)
				p2++;
			if (dp[i] == dp[p3] * 3)
				p3++;
			if (dp[i] == dp[p5] * 5)
				p5++;
		}
		return dp[n - 1];
	}
};

剑指 Offer 50. 第一个只出现一次的字符

难度简单39收藏分享切换为英文关注反馈

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。

示例:

s = "abaccdeff"
返回 "b"

s = "" 
返回 " "
class Solution {
public:
    char firstUniqChar(string s) {
        int a[26] = {0};
        if(s == "") return ' ';
        for(int i = 0; i < s.size(); i++)
        {
            int b = s[i] - 'a';
            a[b] += 1;
        }
        for(int i = 0; i < s.size(); i++)
        {
            int b = s[i] - 'a';
            if(a[b] == 1) return s[i];
        }
        return ' ';
    }
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值