思维开放题
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;
}
};