首页 > 其他分享 >剑指offer——Day24 数学(中等)

剑指offer——Day24 数学(中等)

时间:2023-02-06 12:44:20浏览次数:44  
标签:return target offer int Day24 代码 中等 题解 边界

Day24 2023.2.6 数学(中等)

剑指Offer 14 - Ⅰ. 剪绳子

自己实现

就是简单地把给的数n尽可能平均分为m份(mfor(m=2;m<n;m++)),然后再比较每个m的乘积结果,最后再取最大值

代码如下:

class Solution {
public:
    int cuttingRope(int n) {
        int m=2;
        if(n==2)return 1;
        int max=0;
        for(;m<n;m++){
            int left=n%m;
            int sing=n/m;
            int pro_ori = pow(sing,m-left);
            int pro_left=pow(sing+1,left);
            int now = pro_ori*pro_left;
            if(now>max)max=now;
        }
        return max;
    }
};

代码表现

hint

  • 其实这种题就相当于要先用纯数学推导一下,才能尽可能简化过程。
  • 这个地方的结论就是尽量等分,并且尽可能分为3段能使乘积最大,推导过程要用到算数几何均值不等式

剑指Offer 57 - Ⅱ. 和为s的连续正数序列

自己实现

自己的思路还是想用先平均分target的方法,然后往两边扩散,但是感觉这个会很耗时间,特别是对于target比较大的时候。所以就没有继续写下去了,直接看题解了

题解

题解采用了滑动窗口,对于这种连续序列就该用滑动窗口。

设置好左边界和右边界,并实时更新滑动窗口里面的和s,当s==target时,保存当前序列,并将左边界向右移动;当s<target时,将左边界向右移动;当s>target时,将右边界向右移动

代码如下:

class Solution {
public:
    vector<vector<int>> findContinuousSequence(int target) {
        vector<vector<int>> res;
        if(target==0)return res;
        int i=1,j=2,s=3;
        while(i<j){
            if(s==target){
                vector<int> ans;
                for(int m=i;m<=j;m++)ans.push_back(m);
                res.push_back(ans);
            }
            if(s>=target){
                s-=i;
                i++;
            }
            else{
                j++;
                s+=j;
            }
        }
        return res;
        
    }
};

代码表现

hint

  • 这种连续序列就应该考虑滑动窗口的方式,但是要考虑好左边界和右边界的移动,一般都是向右移动

剑指Offer 62.圆圈中最后剩下的数字

自己实现

这个题目是之前程序设计专题中讲过的猴子选大王的问题(更常见的是叫做约瑟夫环问题),这个当然可以用逐个删除的方式来做,但是这个一定是最耗时的做法。之前老师讲过用极少的代码量就能实现的,直接看题解了

题解

其实就是用动态规划来做。

设n个数每隔m个进行删除的问题的最终解为f(n,m),那么f(n,m)是可以由f(n-1,m)得到的,具体为f(n)=(f(n-1)+m)%n,那么对n进行迭代递推即可。其中f(1,m)=0

代码如下:

class Solution {
public:
    int lastRemaining(int n, int m) {
        int x=0;
        for(int i=2;i<=n;i++){  //dp[1]就等于0, 已经处理了,然后由于dp是从1下标开始,所以要i<=n
            x=(x+m)%i;	//这列要注意%i而不是%n
        }
        return x;
    }
};

代码表现

hint

  • 这个题目就是动态规划的经典想法,只是可能这个%i容易搞错

标签:return,target,offer,int,Day24,代码,中等,题解,边界
From: https://www.cnblogs.com/cspzyy/p/17095044.html

相关文章

  • 《剑指Offer》-3-数组中重复的数字
    我觉得这道题完全可以出难一点,可以返回有哪些数字重复了,分别重复了几次经评论区提醒,或许考察的是与面试官的沟通能力,对不同解法的衡量取舍:比如时间优先可以用set轻松解......
  • 剑指offer——Day23 数学(简单)
    Day232023.2.5数学(简单)剑指Offer39.数组中出现次数超过一半的数字自己实现因为考虑到这个数字起码有数组长度的一般那么多,那么如果把所有该数字放在一起,它势必会占......
  • 《剑指Offer》-58-Ⅱ-左旋字符串
    stringreverseLeftWords(strings,intn){ stringres; for(inti=n;i<s.size();i++)res.push_back(s[i]); for(inti=0;i<n;i++)res.push_back......
  • 《剑指Offer》-5-替换空格
    因为C++中的string本质上是一个静态数组,所以不能直接将长度1的空格直接替换为长度3的指定字符串也就是说要准备一个新的字符串才行 stringreplaceSpace(string......
  • 力扣-138-复杂链表的复制/剑指Offer-35-复杂链表的复制
    与复制普通链表的区别在于:多出了一个随机指针我们考虑下复制一个普通链表:遍历并复制节点i,让构造的他的上一个节点指向i看起来只需要2个指针,指针1指向当前构造的节点,指......
  • 剑指offer——Day22 位运算(中等)
    Day222023.2.4位运算(中等)剑指offer56-Ⅰ.数组中数字出现的次数自己实现就直接结合set进行遍历,然后出现重复就从set里面删除掉,最后就能得到只包含出现过一次的set......
  • 剑指offer——Day21 位运算(简单)
    Day212023.2.3位运算(简单)剑指offer15.二进制中1的个数自己实现这个题最简单的做法很容易理解,就是执行while(n!=0)循环,然后在循环中n>>=1,并判断如果n&1==1那么就要对......
  • leetcode 中等(设计):[146, 155, 208, 211, 284, 304, 307, 341, 355, 380]
    目录146.LRU缓存155.最小栈208.实现Trie(前缀树)211.添加与搜索单词-数据结构设计284.顶端迭代器304.二维区域和检索-矩阵不可变307.区域和检索-数组可修......
  • 收到offer之后的回复术语
    不去:您好,非常荣幸能收到贵岗的offer,感谢您对我能力的认可,但贵公司岗位要求/薪资结构和我预想还有一定的差距,希望今后有共事的机会,祝您工作顺利! 去:您好,非常荣幸能......
  • 剑指offer——Day18 搜索与回溯算法(中等)
    Day182023.1.31搜索与回溯算法(中等)剑指offer55-Ⅰ.二叉树的深度自己实现这个题就是纯纯简单的DFS,当然用BFS也可以做,这里使用的是DFS代码如下:/***Definition......