剑指offer---思维开放题

1. 剑指offer61题—扑克牌中的顺子

链接:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof/
在这里插入图片描述
先对数组执行排序。

  • 判别重复: 排序数组中的相同元素位置相邻,因此可通过遍历数组,判断 nums[i] = nums[i + 1]是否成立来判重。
  • 获取最大 / 最小的牌: 排序后,数组末位元素 nums[4]nums[4] 为最大牌;元素 nums[joker]nums[joker] 为最小牌,其中 jokerjoker 为大小王的数量。
class Solution {
public:
    bool isStraight(vector<int>& nums) {
        //首先前后两个不能有相同的,才能表示顺子
        //什么叫顺子?最后一张牌-第一张牌的差值要小于5
        //统计大小王的数量,且保证nums[4] - num[joker] < 5; 
        int joker = 0;
        sort(nums.begin(),nums.end());
        for(int i = 0;i<nums.size()-1;++i)
        {
            if(nums[i] == 0)
            {
                joker++;
                continue;
            }
            // 前后两张牌不能是相同的,这里的判断逼迫必须要去修正数组的判断条件
            if(nums[i] == nums[i+1])
                return false;
        }
        return nums[4] - nums[joker] < 5;
    }
};

2. 剑指offer62题—圆圈中最后剩下的数字

链接: https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/
在这里插入图片描述
题解:

在这里插入图片描述
看完上面的那个讲解,你就会发现,最终留下的哪一个人的位置坐标一定是0,然后在倒着推导,计算出来当人数为n的时候他的坐标应该是多少呢?
最终就是这个递推公式的推导最重要

class Solution {
public:
    int lastRemaining(int n, int m) {
        //这个是倒着求最终的位置呢
        int suv = 0; //f(n,m)表示有n个人的时候,每次都删除m个,最终剩下的人的位置坐标
        //最终就会i剩下一个人,这个人的坐标肯定是0
        //此时我们往回推算,当两个人的时候这个最后剩余的人的位置坐标应该是多少呢?
        //3个人,4个人.....一直到n个人这个最终位置的下标应该是多少呢?
        for(int i = 2;i<=n;++i)
        {
            suv = (suv + m) % i;
        }
        return suv;
    }
};

3. 剑指offer63题—股票的最大利润

链接:https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof/
在这里插入图片描述

class Solution {
public:
    //这题起始并不需要使用到动态规划的只是就能够解决
    //首先可以使用暴力求解的方法来求解
    //其次我们想要利润最大化,那么我们需要到第i天的时候,记录下来i-1天前中股票利润最小的那一天情况
    int maxProfit(vector<int>& prices) {
        if(prices.size() == 0 || prices.size() == 1)
            return 0;
        int min = prices[0];
        int maxdiff = prices[1] - min;
        for(int i = 2;i<prices.size();++i)
        {
            //一上来首先应该看是否需要更新一下最小值
            if(prices[i-1] < min)
                min = prices[i-1];
            int curdiff = prices[i] - min;
            if(curdiff > maxdiff)
                maxdiff = curdiff;
        }
        if(maxdiff < 0)
            return 0;
        else
            return maxdiff;
    }
};

4. 剑指offer64题—求1+2+…+n

链接:https://leetcode-cn.com/problems/qiu-12n-lcof/
在这里插入图片描述

class Solution {
    class Sum
    {
    public:
            Sum()
            {
                _ret += _i;
                ++_i;
            }
    };
public:
    int sumNums(int n) {
        //因为这个函数有可能会被调用多次,如果第二次在调用这个sunNums()函数,但是_i 和 _ret都还是上一次的调用完结果的值,那就不太好了,所以初始化一下是最好的
        _i = 1;
        _ret = 0;
        Sum arr[n];
        return _ret;
    }
private:
    static int _i;
    static int _ret;
};
int Solution::_i = 1;
int Solution::_ret = 0;

5. 剑指offer65题—不用加减乘除做加法

链接:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/
在这里插入图片描述

class Solution {
public:
    int add(int a, int b) {
        while(b != 0)
        {
            int no_jinwei = a ^ b;
            int jinwei = (unsigned int)(a & b) << 1;
            //此时需要这个进位的和不进位的再次相加,那么又回到了题目的本意,不要使用加减乘除做加法,所以此时就需要进行迭代,再次重复上面的过程,直到不在产生进位为止
            a = no_jinwei;
            b = jinwei;
        }
        return a;
    }
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值