【Leetcode -292.Nim游戏 -326. 3的幂 -338.比特位计数】

简介: 【Leetcode -292.Nim游戏 -326. 3的幂 -338.比特位计数】

Leetcode -292.Nim游戏

你和你的朋友,两个人一起玩 Nim 游戏:

桌子上有一堆石头。

你们轮流进行自己的回合, 你作为先手 。

每一回合,轮到的人拿掉 1 - 3 块石头。

拿掉最后一块石头的人就是获胜者。

假设你们每一步都是最优解。请编写一个函数,来判断你是否可以在给定石头数量为 n 的情况下赢得游戏。如果可以赢,返回 true;否则,返回 false 。

示例 1:

输入:n = 4

输出:false

解释:以下是可能的结果 :

  1. 移除1颗石头。你的朋友移走了3块石头,包括最后一块。你的朋友赢了。
  2. 移除2个石子。你的朋友移走2块石头,包括最后一块。你的朋友赢了。
  3. 你移走3颗石子。你的朋友移走了最后一块石头。你的朋友赢了。
    在所有结果中,你的朋友是赢家。

示例 2:

输入:n = 1

输出:true

示例 3:

输入:n = 2

输出:true

提示:

1 <= n <= 231 - 1

  1. 递归(时间复杂度大,超时)
bool canWinNim(int n)
  {
      if (n >= 1 && n <= 3)
          return true;
      else if (n == 4)
          return false;
      else
          return canWinNim(n - 4);
  }
  1. 数学方法

从数学角度推理可得,只要在我拿石头时,n的值是4的倍数时,我就会输,否则,我就赢;

bool canWinNim(int n)
    {
        return n % 4 != 0;
    }

Leetcode -326. 3的幂

给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。

整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x

示例 1:

输入:n = 27

输出:true

示例 2:

输入:n = 0

输出:false

示例 3:

输入:n = 9

输出:true

示例 4:

输入:n = 45

输出:false

提示:

  • 2^31 <= n <= 2^31 - 1
  1. 递归
bool isPowerOfThree(int n)
  {
      //小于等于0返回falsse
      if (n <= 0)
          return false;
      //等于1即使3^0,返回true
      else if (n == 1)
          return true;
      //若n取模不为0,不是3的幂
      else if (n % 3 != 0)
          return false;
      //除了以上三种情况,进入递归
      else
          return isPowerOfThree(n / 3);
  }
  1. 试除法

我们的思路是,将n一直除以3,看它的余数是否等于0,若等于0,就取它的商继续除,直到它的余数等于1或者不能整除3;若等于1,即是3的幂;若不为1,返回false;

bool isPowerOfThree(int n)
    {
        if (n <= 0)
            return false;
        //用n一直除以3,直到n%3不等于0,即n不能整除3,就返回falses
        //若n能整除3,就取它的商,一直到n为1,当n为1,即是3的幂,返回true
        while (!(n % 3))
            n /= 3;
        if (n == 1)
            return true;
        else
            return false;
    }

Leetcode -338.比特位计数

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,

返回一个长度为 n + 1 的数组 ans 作为答案。

示例 1:

输入:n = 2

输出:[0, 1, 1]

解释:

0 – > 0

1 – > 1

2 – > 10

示例 2:

输入:n = 5

输出:[0, 1, 1, 2, 1, 2]

解释:

0 – > 0

1 – > 1

2 – > 10

3 – > 11

4 – > 100

5 – > 101

提示:

0 <= n <= 10^5

我们的思路是,判断每个数字上二进制的每个位是否是1,若是1,就用count++记录;否则,继续判断下一位;

int* countBits(int n, int* returnSize)
    {
        //开辟好返回的空间,长度为n+1
        int* p = (int*)malloc(sizeof(int) * (n + 1));
        assert(p);
        *returnSize = n + 1;
        //遍历0-n的数字
        for (int i = 0; i <= n; i++)
        {
            //用count来记录每个数字二进制上1的个数
            int count = 0;
            //判断每个数字二进制上的最后一位
            //将它按位与1,就能知道最后一位是什么,如果是1,count就++
            for (int j = 0; j < 32; j++)
            {
                if ((i >> j) & 1 == 1)
                {
                    count++;
                }
            }
            //将count放进开辟好的数组
            p[i] = count;
        }
        //最后返回这个数组
        return p;
    }
目录
相关文章
|
1月前
|
算法
Leetcode第45题(跳跃游戏II)
这篇博客文章讨论了如何使用贪心算法解决LeetCode第45题“跳跃游戏II”,目的是找到使用最少跳跃次数到达数组末尾的策略。
75 8
Leetcode第45题(跳跃游戏II)
|
3月前
|
算法
LeetCode第55题跳跃游戏
LeetCode第55题"跳跃游戏"的解题方法,通过记录当前最远可达到的位置并判断每个位置是否可达以及能否到达末尾,有效解决了跳跃至数组末尾的可行性问题。
LeetCode第55题跳跃游戏
|
1月前
Leetcode第55题(跳跃游戏)
LeetCode第55题“跳跃游戏”要求判断在一个非负整数数组中,从第一个位置出发,是否能够到达最后一个位置,其中每个位置的元素代表可跳跃的最大长度。
27 0
|
3月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
50 1
|
3月前
|
Python
【Leetcode刷题Python】174. 地下城游戏
LeetCode 174题 "地下城游戏" 的Python解决方案,使用动态规划算法计算骑士从左上角到右下角拯救公主所需的最低初始健康点数。
51 3
|
3月前
|
算法 索引 Python
【Leetcode刷题Python】55. 跳跃游戏
解决LeetCode "跳跃游戏"问题的Python实现代码,使用了贪心算法的思路。代码中初始化最远可到达位置 max_k,并遍历数组 nums,通过更新 max_k 来记录每次能跳到的最远位置,如果在任何时刻 max_k 大于或等于数组的最后一个索引,则返回 True,表示可以到达数组的末尾;如果当前索引 i 超出了 max_k,则返回 False,表示无法继续前进。时间复杂度为 O(n),空间复杂度为 O(1)。
49 1
|
3月前
|
算法
LeetCode第45题跳跃游戏 II
LeetCode第45题"跳跃游戏 II"的解题方法,通过一次循环和选择每个位置的最大可跳距离,有效减少了跳跃次数,简化了问题。
|
5月前
力扣-2029-石子游戏-‘屎山’代码
力扣-2029-石子游戏-‘屎山’代码
40 3
|
5月前
|
算法 数据挖掘 开发者
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
LeetCode题目55:跳跃游戏【python5种算法贪心/回溯/动态规划/优化贪心/索引哈希映射 详解】
|
5月前
|
算法
力扣经典150题第三十八题:生命游戏
力扣经典150题第三十八题:生命游戏
41 0