研究生生活——算法
文章平均质量分 63
主要记录在Leetcode刷题时遇到的问题和解决办法,以及总结常见的高频算法
LikeMarch
不悲叹过去,不荒废现在,不惧怕未来。
展开
-
航海探险(BFS+优先队列,并输出路径)
2021年08月22日 周日 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目描述2. DFS 或 BFS2.1 DFS2.2 BFS + 优先队列3. 总结DFS和BFS的区别1. 题目描述给你一个由"0"(水)、“1”(陆地)和2"(障碍物)组成的的一维网格,再给你一个两栖交通工具,走陆地费用为1,走水路费用为2,障碍物无法通行,请你计算从网格的起始位置行驶到最终位置的最小费用。注意:仅可以水平方向和竖直方向行驶。如果无法到达目的地,则返回-1。另外,起始第1个位置不算,根据原创 2021-08-22 11:48:03 · 741 阅读 · 2 评论 -
马走棋盘算法
2021年08月16日 周一 天气雨 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. DFS参考文献1. 题目简介原题链接:http://noi.openjudge.cn/ch0205/8465/2. DFS思路比较清晰,直接用dfs在8个方向上进行搜索即可。#include <iostream>#include <vector>using namespace std;int t, m, n, x, y, mn, ans;vector<原创 2021-08-16 20:52:15 · 283 阅读 · 0 评论 -
LeetCode 120. 三角形最小路径和(要求输出具体路径)
2021年07月15日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 动态规划2. 拓展:输出具体路径3. 空间优化4. 总结与反思https://leetcode-cn.com/problems/triangle/1. 动态规划题目本身不难,自底向上计算最简单。class Solution {public: int minimumTotal(vector<vector<int>>& triangle) { int原创 2021-07-15 12:02:02 · 343 阅读 · 0 评论 -
LeetCode 148. x的平方根(二分法;牛顿迭代法)
2021年06月07日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. x为非负整数1.1 返回整数1.2 返回浮点数1.2.1 二分法(不保证正确)1.2.2 牛顿迭代法(推荐)2. x为浮点数3. 总结1. x为非负整数1.1 返回整数这时稍微简单点,用二分法即可,唯一需要注意的就是越界问题。class Solution {public: int mySqrt(int x) { if(x==0 || x==1) return x;原创 2021-06-08 12:45:34 · 285 阅读 · 1 评论 -
LeetCode 518 零钱兑换II(弄清内外循环的顺序,一个是求组合数,一个是求排列数)
2021年5月14日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解(经典动态规划)1. 题目简介518. 零钱兑换 II2. 题解(经典动态规划)非常经典的动态规划题目,需要注意的是:本题求的是组合数,内外循环的顺序要搞清楚,如果交换内外循环的话,就变成了排列数。可以这样记忆: 如果钱币循环在外层,说明钱币出现的顺序已经被人为地确定了,这样就不会出现顺序不一样,但是和为 amout 的答案。因此,钱币在外层是组合数,在内层是排列数。class So原创 2021-05-14 22:34:02 · 144 阅读 · 0 评论 -
美团笔试 最优二叉树II(树形DP)
2021年04月21日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 树形DP参考文献1. 题目简介最优二叉树II2. 树形DP图源:shanxiansen310#include<bits/stdc++.h>using namespace std;// 最大节点个数const int maxN = 301;// 二叉树节点值vector<int> nums;// 备忘录int ans[maxN][maxN][maxN原创 2021-04-21 21:44:55 · 1628 阅读 · 1 评论 -
LeetCode 148. 排序链表(归并和快速排序)
2021年04月18日 周日 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解2.1 选择排序2.2 归并排序1. 题目简介148. 排序链表2. 题解2.1 选择排序2.2 归并排序原创 2021-04-18 15:08:04 · 545 阅读 · 0 评论 -
LeetCode 189. 旋转数组(翻转数组;环形替换)
2021年04月15日 周四 天气大风 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解2.1 开辟新数组复制2.2 三次翻转2.3 环形替换参考文献1. 题目简介189. 旋转数组2. 题解2.1 开辟新数组复制将原数组下标为 i 的元素放至新数组下标为 (i+k) mod n 的位置。class Solution {public: void rotate(vector<int>& nums, int k) { int原创 2021-04-15 21:10:22 · 137 阅读 · 0 评论 -
LeetCode 287. 寻找重复数(龟兔赛跑;二分查找)
2021年04月15日 周四 天气大风 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解2.1 二分查找法2.2 龟兔赛跑算法1. 题目简介287. 寻找重复数2. 题解2.1 二分查找法class Solution {public: int findDuplicate(vector<int> &nums) { int len = nums.size(); int left = 1; int原创 2021-04-15 10:35:38 · 163 阅读 · 0 评论 -
LeetCode 9. 回文数(反转一半的数字)
2021年04月14日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解2.1 计算首尾数值进行比较2.2 反转一半的数字(掌握)参考文献1. 题目简介9. 回文数2. 题解2.1 计算首尾数值进行比较刚开始的思路是,先计算位数,然后根据位数计算首尾数值,进行比较。class Solution {public: bool isPalindrome(int x) { if(x<0) return false;原创 2021-04-14 16:23:38 · 155 阅读 · 0 评论 -
LeetCode 739. 每日温度(逆序遍历;单调栈)
2021年04月14日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解2.1 从后往前遍历2.2 单调栈参考文献1. 题目简介739. 每日温度2. 题解2.1 从后往前遍历思路:维护一个数组 t ,记录每个温度第一次出现的下标,从后往前遍历,找出大于当前元素中,索引最小的那个,就是第一个大于当前元素值的索引,同时更新数组 t 。为什么要从后往前遍历?答:如果从前往后遍历,前面的元素可能会影响当前位置结果的判断。而从后往前遍历,保证了当前元素前面的元原创 2021-04-14 15:04:24 · 158 阅读 · 0 评论 -
LeetCode 128. 最长连续序列(判断左边界法)
2021年04月11日 周日 天气阴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 判断左边界法参考文献1. 题目简介128. 最长连续序列2. 判断左边界法class Solution {public: int longestConsecutive(vector<int>& nums) { int res = 0; unordered_set<int> uset; // 第一步:去原创 2021-04-11 17:11:13 · 107 阅读 · 0 评论 -
LeetCode 224. 基本计算器(考虑“ + - * / ( ) ” 所有情况,递归、迭代双版本)
2021年04月10日 周六 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解2.1 只处理加减(迭代)2.2 处理加减乘除(递归)参考文献1. 题目简介224. 基本计算器2. 题解2.1 只处理加减(迭代)核心思想:遍历的同时进行计算。 由于只有加减法,所以直接从前到后进行计算,要注意的就是括号的处理:遇到 “(” ,则将前一个数和运算符压入栈中,遇到 “)” ,则把它们取出来,和括号里计算的结果相加(符号也可能是减号)。class Solution {原创 2021-04-10 22:24:20 · 242 阅读 · 0 评论 -
LeetCode 32. 最长有效括号(dp;栈;遍历)
2021年04月10日 周六 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解2.1 dp(掌握)2.2 栈2.3 两次遍历(掌握)参考文献1. 题目简介32. 最长有效括号2. 题解2.1 dp(掌握)dp是这道题的标准解法,建议掌握。dp思路:class Solution {public: int longestValidParentheses(string s) { const int n = s.size();原创 2021-04-10 13:20:03 · 141 阅读 · 0 评论 -
LeetCode 662. 二叉树最大宽度(合理利用二叉树顺序存储下标对应关系)
2021年04月09日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. BFS法参考文献1. 题目简介662. 二叉树最大宽度2. BFS法合理利用二叉树顺序存储下标对应关系,为每个根结点建立编号,根据编号求得宽度值。class Solution {public: int widthOfBinaryTree(TreeNode* root) { // 保存最大的宽度 int res = 0; // 队列原创 2021-04-09 22:30:09 · 120 阅读 · 0 评论 -
460. LFU 缓存(哈希表+双向链表)
2021年04月09日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 哈希表+双向链表参考文献1. 题目简介460. LFU 缓存2. 哈希表+双向链表本题的思路类似于 146. LRU 缓存机制 ,但是要更复杂。感谢大神 liweiwei1419 的配图。1. LRU 和 LFU 的区别2. 本题核心思想struct Node{ int key, val, freq; Node(int _key, int _val, int _f原创 2021-04-09 21:08:27 · 165 阅读 · 0 评论 -
Leetcode 82. 删除排序链表中的重复元素 II(迭代;递归(非简单的递归))
2021年03月26日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解2.1 迭代2.2 递归参考文献1. 问题简介82. 删除排序链表中的重复元素 II2. 题解2.1 迭代求解的关键点在于:当遇到重复元素并删除完了的时候,不要更新pre ,因为可能cur->next还是重复的节点;只有当cur->val和cur->next->val不相等时(保证了cur一定不是重复的节点),才更新pre。class Solution {p原创 2021-03-26 22:30:03 · 88 阅读 · 0 评论 -
Leetcode 718. 最长重复子数组(DP;滑动窗口)
2021年03月25日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解2.1 动态规划2.2 滑动窗口(思路巧妙)参考文献1. 问题简介718. 最长重复子数组2. 题解2.1 动态规划class Solution {public: int findLength(vector<int>& A, vector<int>& B) { int m = A.size(), n = B.size(原创 2021-03-25 16:09:06 · 152 阅读 · 2 评论 -
Leetcode 470. 用 Rand7() 实现 Rand10()(拒绝采样)
2021年03月19日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解(拒绝采样)2.1 方法一2.2 方法二参考文献1. 问题简介470. 用 Rand7() 实现 Rand10()2. 题解(拒绝采样)具体可参考:从最基础的讲起如何做到均匀的生成随机数2.1 方法一class Solution {public: int rand10() { while(true){ int a = rand7();原创 2021-03-19 17:54:29 · 159 阅读 · 0 评论 -
Leetcode 31. 下一个排列(为什么要这么做?)
2021年03月19日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解(为什么是这么做?)参考文献1. 问题简介31. 下一个排列2. 题解(为什么是这么做?)这道题最重要的是理解思路,思考为什么这么做之后就能得到下一个排列? 下面是具体思路:思路理清之后,代码就比较容易实现了:class Solution {public: void nextPermutation(vector<int>& nums) {原创 2021-03-19 10:53:27 · 78 阅读 · 0 评论 -
Leetcode 46. 全排列(经典回溯法)
2021年03月18日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解(回溯大法)2.1 临时数组法2.2 交换法*复杂度分析参考文献1. 问题简介46. 全排列2. 题解(回溯大法)2.1 临时数组法class Solution {public: unordered_set<int> uset; // 利用哈希表判断元素是否遍历过了 vector<vector<int>> res; vect原创 2021-03-18 15:21:29 · 135 阅读 · 0 评论 -
LeetCode 56.合并区间(排序+双指针)
2021年03月16日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解参考文献1. 问题简介56. 合并区间2. 题解排序+双指针:先按照左区间的大小进行排序,然后利用双指针,循环的进行区间合并。class Solution {public: struct cmp{ bool operator()(const vector<int>& v1,const vector<int>& v2){原创 2021-03-16 22:37:12 · 104 阅读 · 0 评论 -
LeetCode 42. 接雨水(双指针巧妙求解,韦恩图拍案叫绝)
2021年03月13日 周六 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 多种解法(数学法最为巧妙)2.1 按列求(循序渐进)2.1.1 暴力法(双循环)2.1.2 暴力法优化一——动态规划2.1.3 暴力法优化二——双指针,巧妙求解2.2 按行求(单调栈)2.3 数学法(韦恩图,拍案叫绝)参考文献1. 问题简介42. 接雨水2. 多种解法(数学法最为巧妙)具体可参考:https://leetcode-cn.com/problems/trapping-rain原创 2021-03-13 21:48:01 · 253 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表(考察中序遍历,需要存储前一个节点)
2021年03月11日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解(中序遍历,存储前一个节点)2.1 递归2.2 迭代参考文献1. 问题简介剑指 Offer 36. 二叉搜索树与双向链表2. 题解(中序遍历,存储前一个节点)中序遍历每一个节点,同时存储上一个节点,完成双向链表的构建。2.1 递归class Solution {public: Node* pre, *head; Node* treeToDoublyList(Node原创 2021-03-11 22:25:26 · 87 阅读 · 0 评论 -
Leetcode20 有效的括号(栈的妙用(有简洁写法))
2021年3月10日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解(栈的妙用)参考文献1. 题目简介20. 有效的括号2. 题解(栈的妙用)这道题的思路并不难:利用栈先进先出的特点,比较容易解决,问题在于程序的实现,有一种比较简洁的写法。常规写法:class Solution {public: bool isValid(string s) { stack<char> st; for(const原创 2021-03-10 15:22:02 · 54 阅读 · 0 评论 -
LeetCode 160. 相交链表(合并情况,简化代码)
2021年3月5日 周五天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解1. 题目简介160. 相交链表2. 题解思路比较简单:走完自己的路之后,再走别人的路,这样就能一起到达交点了。问题是如何让代码写的简洁。我们可以把两个链表不相交的情况,看作它们相交于NULL,这样就可以把相交和不相交合并成相交一种情况:class Solution {public: ListNode *getIntersectionNode(ListNode *headA,原创 2021-03-05 10:10:43 · 84 阅读 · 1 评论 -
Leetcode 25. K 个一组翻转链表(模拟法)
2021年3月4日 周四天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解(模拟法)参考文献1. 题目简介25. K 个一组翻转链表2. 题解(模拟法)朴实无华的模拟法:思路类似于 Leetcode 92. 反转链表 II,只不过更复杂一些,需要每次根据头尾结点反转k个结点,然后把断掉的地方接上,直到剩下的结点不足k个为止。/** * Definition for singly-linked list. * struct ListNode { *原创 2021-03-04 10:38:54 · 102 阅读 · 1 评论 -
Leetcode 15. 三数之和(排序 + 双指针)
2021年3月3日 周三天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解(排序 + 双指针)参考文献1. 题目简介Leetcode 15. 三数之和2. 题解(排序 + 双指针)主要思路:排序 + 双指针,难点是如何去重。算法流程如下:class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { sor原创 2021-03-03 19:39:37 · 211 阅读 · 1 评论 -
146. LRU 缓存机制(链表+哈希表)
2021年3月2日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解参考文献1. 题目简介146. LRU 缓存机制2. 题解分析 LRU 的操作,要让 put 和 get 方法的时间复杂度为 O(1),可以总结出 cache 这个数据结构必要的条件:查找快,插入快,删除快,有顺序之分。所以考虑链表(插入快,删除快,有顺序之分) + 哈希表(查找快)。class LRUCache {private: int cap; list<p原创 2021-03-02 18:38:12 · 114 阅读 · 0 评论 -
剑指 Offer 67. 把字符串转换成整数(情况复杂,考虑仔细)
2021年02月12日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 情况复杂,考虑仔细参考文献1. 问题简介剑指 Offer 67. 把字符串转换成整数2. 情况复杂,考虑仔细情况比较复杂,需要考虑周全,不多说了,直接看大佬的题解吧 面试题67. 把字符串转换成整数(数字越界处理,清晰图解)class Solution { public: int strToInt(string str) { int res = 0原创 2021-02-12 23:27:37 · 78 阅读 · 0 评论 -
剑指 Offer 51. 数组中的逆序对(归并排序的应用)
2021年02月12日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解参考文献1. 问题简介剑指 Offer 51. 数组中的逆序对2. 题解做这道题之前要对归并排序掌握的十分熟练,这里推荐 图解排序算法(四)之归并排序,借助图解能够非常快速的理解归并排序的内涵。熟练掌握归并排序后,再仔细看下leetcode上 superkakayong 大佬的题解,这道题的解题思路也就比较清晰了。之后就是按照思路,一步步写出代码。由思路构建代码的过程一定充满了艰辛,但原创 2021-02-12 22:18:41 · 80 阅读 · 2 评论 -
剑指 Offer 37. 序列化二叉树(前序遍历,后序遍历,层次遍历)
2021年02月12日 周五 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解2.1 前序遍历(或后序遍历)2.2 层序遍历参考文献1. 问题简介剑指 Offer 37. 序列化二叉树2. 题解2.1 前序遍历(或后序遍历)前序遍历在反序列化时应用递归比较简单,后序遍历在反序列化时,可以从后往前遍历,顺序就变成了 “根—>右—>左”,代码上和前序遍历只是略有区别。而中序遍历得到的二叉树不唯一,不能保证反序列化的二叉树为原来的树,如下图所示。图源原创 2021-02-12 21:15:03 · 131 阅读 · 0 评论 -
剑指 Offer 19. 正则表达式匹配(动态规划)
2021年02月11日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 动态规划参考文献1. 问题简介剑指 Offer 19. 正则表达式匹配2. 动态规划这道题还是非常有难度的,我是直接看这位大佬的题解,感觉只要花点时间仔细琢磨一下,思路还是可以捋清楚的,下面是代码:class Solution {public: bool isMatch(string s, string p) { int m = s.size();原创 2021-02-11 22:07:18 · 71 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先(后序遍历 DFS)
2021年02月11日 周四 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 后序遍历 DFS参考文献1. 问题简介剑指 Offer 68 - II. 二叉树的最近公共祖先2. 后序遍历 DFS二叉树的后序遍历,分情况进行讨论,具体看注释,解释的比较清楚。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *原创 2021-02-11 16:12:40 · 181 阅读 · 0 评论 -
剑指 Offer 66. 构建乘积数组(左右开弓)
2021年02月11日 周四天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解参考文献1. 问题简介剑指 Offer 66. 构建乘积数组2. 题解图源 Krahets ,侵删。如上图,可以用两轮循环,第一轮计算左下角的乘积,第二轮计算右上角的乘积,再乘以左下角乘积,就得到了最终结果。当然,也可以一轮计算解决问题,方法就是 左右开弓 ,同时计算左边和右边的乘积值,一轮循环解决问题。代码如下:class Solution {public: vect原创 2021-02-11 11:23:45 · 95 阅读 · 1 评论 -
剑指 Offer 65. 不用加减乘除做加法(位运算的应用)
2021年02月10日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 问题简介2. 题解参考文献1. 问题简介剑指 Offer 65. 不用加减乘除做加法2. 题解把 a+b 转换成 非进位 + 进位,因为不能用加法,所以要一直转换直到第二个加数变成0。这时,第一个加数就是最终结果。class Solution {public: int add(int a, int b) { // 当第二个加数 b 变成0时,第一个加数 a 就是最终结果原创 2021-02-10 21:43:23 · 63 阅读 · 0 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字(约瑟夫问题:数学方法;模拟法)
2021年02月09日 周二 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 约瑟夫问题2. 题解2.1 计算索引法(超时)2.2 数学解法参考文献1. 约瑟夫问题剑指 Offer 62. 圆圈中最后剩下的数字本题就是著名的约瑟夫问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。2. 题解2.1 计算索引法(超时)这种方法就是用数组模拟整个过程,核心思路是计算下一个待删除数的索引: idx = (idx原创 2021-02-09 23:26:45 · 93 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值(单调队列的典型应用)
2021年02月08日 周一 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 单调队列的应用参考文献1. 题目简介剑指 Offer 59 - I. 滑动窗口的最大值2. 单调队列的应用暴力法比较简单,但是时间复杂度为 O(nk),这里就不介绍了,说一下借助单调队列的解法,时间复杂度为 O(n)。总结来说就是:维护一个单调队列,队头为最大元素。维护的方式就是,队列中小于当前值的元素都弹出,然后把当前值加入队列。注意上一次最大元素可能是滑窗的首端,根据这个条件判断是否原创 2021-02-08 11:57:41 · 101 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序(双指针;多次翻转)
2021年02月07日 周日 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解2.1 开辟一个新数组,从后往前迭代2.2 空间复杂度为 O(1)的解法:先整体翻转,再局部翻转参考文献1. 题目简介剑指 Offer 58 - I. 翻转单词顺序2. 题解2.1 开辟一个新数组,从后往前迭代这种方法思路相对简单,代码比较容易实现,缺点就是需要开辟一个新的数组,空间复杂度为 O(n)。class Solution {public: string reve原创 2021-02-07 20:06:13 · 94 阅读 · 0 评论 -
剑指 Offer 56 II. 数组中数字出现的次数 (位运算综合)
2021年02月06日 周六 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】本文目录1. 题目简介2. 题解参考文献1. 题目简介剑指 Offer 56 - II. 数组中数字出现的次数 II2. 题解如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除。我们把数组中所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位是0;否则原创 2021-02-06 21:45:19 · 55 阅读 · 0 评论