├── Readme.md ├── jpg └── gh_883d0218850f_258.jpg └── problem ├── 1.两数之和.md ├── 10.正则表达式匹配.md ├── 100.相同的树.md ├── 101.对称二叉树.md ├── 102.二叉树的层次遍历.md ├── 103.二叉树的锯齿形层次遍历.md ├── 104.二叉树的最大深度.md ├── 105.从前序与中序遍历序列构造二叉树.md ├── 106.从中序与后序遍历序列构造二叉树.md ├── 107.二叉树的层次遍历 II.md ├── 108.将有序数组转换为二叉搜索树.md ├── 109.有序链表转换二叉搜索树.md ├── 11.盛最多水的容器.md ├── 110.平衡二叉树.md ├── 111.二叉树的最小深度.md ├── 112.路径总和.md ├── 113.路径总和 II.md ├── 114.二叉树展开为链表.md ├── 115.不同的子序列.md ├── 116.填充同一层的兄弟节点.md ├── 117.填充同一层的兄弟节点 II.md ├── 118.杨辉三角.md ├── 119.杨辉三角 II.md ├── 12.整数转罗马数字.md ├── 120.三角形最小路径和.md ├── 121.买卖股票的最佳时机.md ├── 122.买卖股票的最佳时机 II.md ├── 123.买卖股票的最佳时机 III.md ├── 124.二叉树中的最大路径和.md ├── 125.验证回文串.md ├── 126.单词接龙 II.md ├── 127.单词接龙.md ├── 128.最长连续序列.md ├── 129.求根到叶子节点数字之和.md ├── 13.罗马数字转整数.md ├── 130.被围绕的区域.md ├── 131.分割回文串.md ├── 132.分割回文串 II.md ├── 133.克隆图.md ├── 134.加油站.md ├── 135.分发糖果.md ├── 136.只出现一次的数字.md ├── 137.只出现一次的数字 II.md ├── 138.复制带随机指针的链表.md ├── 139.单词拆分.md ├── 14.最长公共前缀.md ├── 140.单词拆分 II.md ├── 141.环形链表.md ├── 142.环形链表 II.md ├── 143.重排链表.md ├── 144.二叉树的前序遍历.md ├── 145.二叉树的后序遍历.md ├── 146.LRU缓存机制.md ├── 147.对链表进行插入排序.md ├── 148.排序链表.md ├── 149.直线上最多的点数.md ├── 15.三数之和.md ├── 150.逆波兰表达式求值.md ├── 151.翻转字符串里的单词.md ├── 152.乘积最大子序列.md ├── 153.寻找旋转排序数组中的最小值.md ├── 154.寻找旋转排序数组中的最小值 II.md ├── 155.最小栈.md ├── 16.最接近的三数之和.md ├── 160.相交链表.md ├── 162.寻找峰值.md ├── 164.最大间距.md ├── 165.比较版本号.md ├── 166.分数到小数.md ├── 167.两数之和 II - 输入有序数组.md ├── 168.Excel表列名称.md ├── 169.求众数.md ├── 17.电话号码的字母组合.md ├── 171.Excel表列序号.md ├── 172.阶乘后的零.md ├── 173.二叉搜索树迭代器.md ├── 174.地下城游戏.md ├── 179.最大数.md ├── 18.四数之和.md ├── 187.重复的DNA序列.md ├── 188.买卖股票的最佳时机 IV.md ├── 189.旋转数组.md ├── 19.删除链表的倒数第N个节点.md ├── 190.颠倒二进制位.md ├── 191.位1的个数.md ├── 198.打家劫舍.md ├── 199.二叉树的右视图.md ├── 2.两数相加.md ├── 20.有效的括号.md ├── 200.岛屿的个数.md ├── 201.数字范围按位与.md ├── 202.快乐数.md ├── 203.删除链表中的节点.md ├── 204.计数质数.md ├── 205.同构字符串.md ├── 206.反转链表.md ├── 207.课程表.md ├── 208.实现 Trie (前缀树).md ├── 209.长度最小的子数组.md ├── 21.合并两个有序链表.md ├── 210.课程表 II.md ├── 211.添加与搜索单词 - 数据结构设计.md ├── 212.单词搜索 II.md ├── 213.打家劫舍 II.md ├── 214.最短回文串.md ├── 215.数组中的第K个最大元素.md ├── 216.组合总和 III.md ├── 217.存在重复元素.md ├── 218.天际线问题.md ├── 219.存在重复元素 II.md ├── 22.括号生成.md ├── 220.存在重复元素 III.md ├── 221.最大正方形.md ├── 222.完全二叉树的节点个数.md ├── 223.矩形面积.md ├── 224.基本计算器.md ├── 225.用队列实现栈.md ├── 226.翻转二叉树.md ├── 227.基本计算器 II.md ├── 228.汇总区间.md ├── 229.求众数 II.md ├── 23.合并K个排序链表.md ├── 230.二叉搜索树中第K小的元素.md ├── 231.2的幂.md ├── 232.用栈实现队列.md ├── 233.数字1的个数.md ├── 234.回文链表.md ├── 235.二叉搜索树的最近公共祖先.md ├── 236.二叉树的最近公共祖先.md ├── 237.删除链表中的节点.md ├── 238.除自身以外数组的乘积.md ├── 239.滑动窗口最大值.md ├── 24.两两交换链表中的节点.md ├── 240.搜索二维矩阵 II.md ├── 241.为运算表达式设计优先级.md ├── 242.有效的字母异位词.md ├── 25.k个一组翻转链表.md ├── 257.二叉树的所有路径.md ├── 258.各位相加.md ├── 26.删除排序数组中的重复项.md ├── 260.只出现一次的数字 III.md ├── 263.丑数.md ├── 264.丑数 II.md ├── 268.缺失数字.md ├── 27.移除元素.md ├── 273.整数转换英文表示.md ├── 274.H指数.md ├── 275.H指数 II.md ├── 278.第一个错误的版本.md ├── 279.完全平方数.md ├── 28.实现strStr().md ├── 282.给表达式添加运算符.md ├── 283.移动零.md ├── 284.顶端迭代器.md ├── 287.寻找重复数.md ├── 289.生命游戏.md ├── 29.两数相除.md ├── 290.单词模式.md ├── 292.Nim游戏.md ├── 295.数据流的中位数.md ├── 297.二叉树的序列化与反序列化.md ├── 299.猜数字游戏.md ├── 3.无重复字符的最长子串.md ├── 30.与所有单词相关联的字串.md ├── 300.最长上升子序列.md ├── 301.删除无效的括号.md ├── 303.区域和检索 - 数组不可变.md ├── 304.二维区域和检索 - 矩阵不可变.md ├── 306.累加数.md ├── 307.区域和检索 - 数组可修改.md ├── 309.最佳买卖股票时机含冷冻期.md ├── 31.下一个排列.md ├── 310.最小高度树.md ├── 312.戳气球.md ├── 313.超级丑数.md ├── 315.计算右侧小于当前元素的个数.md ├── 316.去除重复字母.md ├── 318.最大单词长度乘积.md ├── 319.灯泡开关.md ├── 32.最长有效括号.md ├── 321.拼接最大数.md ├── 322.零钱兑换.md ├── 324.摆动排序 II.md ├── 326.3的幂.md ├── 327.区间和的个数.md ├── 328.奇偶链表.md ├── 329.矩阵中的最长递增路径.md ├── 33.搜索旋转排序数组.md ├── 330.按要求补齐数组.md ├── 331.验证二叉树的前序序列化.md ├── 332.重新安排行程.md ├── 334.递增的三元子序列.md ├── 335.路径交叉.md ├── 336.回文对.md ├── 337.打家劫舍 III.md ├── 338.比特位计数.md ├── 34.在排序数组中查找元素的第一个和最后一个位置.md ├── 341.扁平化嵌套列表迭代器.md ├── 342.4的幂.md ├── 343.整数拆分.md ├── 344.反转字符串.md ├── 345.反转字符串中的元音字母.md ├── 347.前K个高频元素.md ├── 349.两个数组的交集.md ├── 35.搜索插入位置.md ├── 350.两个数组的交集 II.md ├── 352.将数据流变为多个不相交间隔.md ├── 354.俄罗斯套娃信封问题.md ├── 355.设计推特.md ├── 357.计算各个位数不同的数字个数.md ├── 36.有效的数独.md ├── 363.矩形区域不超过 K 的最大数值和.md ├── 365.水壶问题.md ├── 367.有效的完全平方数.md ├── 368.最大整除子集.md ├── 37.解数独.md ├── 371.两整数之和.md ├── 372.超级次方.md ├── 373.查找和最小的K对数字.md ├── 374.猜数字大小.md ├── 375.猜数字大小 II.md ├── 376.摆动序列.md ├── 377.组合总和 Ⅳ.md ├── 378.有序矩阵中第K小的元素.md ├── 38.报数.md ├── 380.常数时间插入、删除和获取随机元素.md ├── 381.O(1) 时间插入、删除和获取随机元素 - 允许重复.md ├── 382.链表随机节点.md ├── 383.赎金信.md ├── 384.打乱数组.md ├── 385.迷你语法分析器.md ├── 386.字典序排数.md ├── 387.字符串中的第一个唯一字符.md ├── 388.文件的最长绝对路径.md ├── 389.找不同.md ├── 39.组合总和.md ├── 390.消除游戏.md ├── 391.完美矩形.md ├── 392.判断子序列.md ├── 393.UTF-8 编码验证.md ├── 394.字符串解码.md ├── 395.至少有K个重复字符的最长子串.md ├── 396.旋转函数.md ├── 397.整数替换.md ├── 398.随机数索引.md ├── 399.除法求值.md ├── 4.两个排序数组的中位数.md ├── 40.组合总和 II.md ├── 400.第N个数字.md ├── 401.二进制手表.md ├── 402.移掉K位数字.md ├── 403.青蛙过河.md ├── 404.左叶子之和.md ├── 405.数字转换为十六进制数.md ├── 406.根据身高重建队列.md ├── 407.接雨水 II.md ├── 409.最长回文串.md ├── 41.缺失的第一个正数.md ├── 410.分割数组的最大值.md ├── 412.Fizz Buzz.md ├── 413.等差数列划分.md ├── 415.字符串相加.md ├── 416.分割等和子集.md ├── 417.太平洋大西洋水流问题.md ├── 419.甲板上的战舰.md ├── 42.接雨水.md ├── 420.强密码检验器.md ├── 421.数组中两个数的最大异或值.md ├── 423.从英文中重建数字.md ├── 424.替换后的最长重复字符.md ├── 427.建立四叉树.md ├── 429.N叉树的层序遍历.md ├── 43.字符串相乘.md ├── 430.扁平化多级双向链表.md ├── 432.全 O(1) 的数据结构.md ├── 433.最小基因变化.md ├── 434.字符串中的单词数.md ├── 435.无重叠区间.md ├── 436.寻找右区间.md ├── 437.路径总和 III.md ├── 438.找到字符串中所有字母异位词.md ├── 44.通配符匹配.md ├── 440.字典序的第K小数字.md ├── 441.排列硬币.md ├── 442.数组中重复的数据.md ├── 443.压缩字符串.md ├── 445.两数相加 II.md ├── 446.等差数列划分 II - 子序列.md ├── 447.回旋镖的数量.md ├── 448.找到所有数组中消失的数字.md ├── 449.序列化和反序列化二叉搜索树.md ├── 45.跳跃游戏 II.md ├── 450.删除二叉搜索树中的节点.md ├── 451.根据字符出现频率排序.md ├── 452.用最少数量的箭引爆气球.md ├── 453.最小移动次数使数组元素相等.md ├── 454.四数相加 II.md ├── 455.分发饼干.md ├── 456.132模式.md ├── 457.环形数组循环.md ├── 458.可怜的小猪.md ├── 459.重复的子字符串.md ├── 46.全排列.md ├── 460.LFU缓存.md ├── 461.汉明距离.md ├── 462.最少移动次数使数组元素相等 II.md ├── 463.岛屿的周长.md ├── 464.我能赢吗.md ├── 466.统计重复个数.md ├── 467.环绕字符串中唯一的子字符串.md ├── 468.验证IP地址.md ├── 47.全排列 II.md ├── 470.用 Rand7() 实现 Rand10().md ├── 472.连接词.md ├── 473.火柴拼正方形.md ├── 474.一和零.md ├── 475.供暖器.md ├── 476.数字的补数.md ├── 477.汉明距离总和.md ├── 478.在圆内随机生成点.md ├── 479.最大回文数乘积.md ├── 48.旋转图像.md ├── 480.滑动窗口中位数.md ├── 481.神奇字符串.md ├── 482.密钥格式化.md ├── 483.最小好进制.md ├── 485.最大连续1的个数.md ├── 486.预测赢家.md ├── 488.祖玛游戏.md ├── 49.字母异位词分组.md ├── 491.递增子序列.md ├── 492.构造矩形.md ├── 493.翻转对.md ├── 494.目标和.md ├── 495.提莫攻击.md ├── 496.下一个更大元素 I.md ├── 497.非重叠矩形中的随机点.md ├── 498.对角线遍历.md ├── 5.最长回文子串.md ├── 50.Pow(x, n).md ├── 500.键盘行.md ├── 501.二叉搜索树中的众数.md ├── 502.IPO.md ├── 503.下一个更大元素 II.md ├── 504.七进制数.md ├── 506.相对名次.md ├── 507.完美数.md ├── 508.出现次数最多的子树元素和.md ├── 51.N皇后.md ├── 513.找树左下角的值.md ├── 514.自由之路.md ├── 515.在每个树行中找最大值.md ├── 516.最长回文子序列.md ├── 517.超级洗衣机.md ├── 518.零钱兑换 II.md ├── 519.随机翻转矩阵.md ├── 52.N皇后 II.md ├── 520.检测大写字母.md ├── 521.最长特殊序列 Ⅰ.md ├── 522.最长特殊序列 II.md ├── 523.连续的子数组和.md ├── 524.通过删除字母匹配到字典里最长单词.md ├── 525.连续数组.md ├── 526.优美的排列.md ├── 528.按权重随机选择.md ├── 529.扫雷游戏.md ├── 53.最大子序和.md ├── 530.二叉搜索树的最小绝对差.md ├── 532.数组中的K-diff数对.md ├── 535.TinyURL 的加密与解密.md ├── 537.复数乘法.md ├── 538.把二叉搜索树转换为累加树.md ├── 539.最小时间差.md ├── 54.螺旋矩阵.md ├── 540.有序数组中的单一元素.md ├── 541.反转字符串 II.md ├── 542.01 矩阵.md ├── 543.二叉树的直径.md ├── 546.移除盒子.md ├── 547.朋友圈.md ├── 55.跳跃游戏.md ├── 551.学生出勤纪录 I.md ├── 552.学生出勤记录 II.md ├── 553.最优除法.md ├── 554.砖墙.md ├── 556.下一个更大元素 III.md ├── 557.反转字符串中的单词 III.md ├── 558.四叉树交集.md ├── 559.N叉树的最大深度.md ├── 56.合并区间.md ├── 560.和为K的子数组.md ├── 561.数组拆分 I.md ├── 563.二叉树的坡度.md ├── 564.寻找最近的回文数.md ├── 565.数组嵌套.md ├── 566.重塑矩阵.md ├── 567.字符串的排列.md ├── 57.插入区间.md ├── 572.另一个树的子树.md ├── 575.分糖果.md ├── 576.出界的路径数.md ├── 58.最后一个单词的长度.md ├── 581.最短无序连续子数组.md ├── 583.两个字符串的删除操作.md ├── 587.安装栅栏.md ├── 589.N叉树的前序遍历.md ├── 59.螺旋矩阵 II.md ├── 590.N叉树的后序遍历.md ├── 591.标签验证器.md ├── 592.分数加减运算.md ├── 593.有效的正方形.md ├── 594.最长和谐子序列.md ├── 598.范围求和 II.md ├── 599.两个列表的最小索引总和.md ├── 6.Z字形变换.md ├── 60.第k个排列.md ├── 600.不含连续1的非负整数.md ├── 61.旋转链表.md ├── 62.不同路径.md ├── 63.不同路径 II.md ├── 64.最小路径和.md ├── 65.有效数字.md ├── 66.加一.md ├── 67.二进制求和.md ├── 68.文本左右对齐.md ├── 69.x 的平方根.md ├── 7.反转整数.md ├── 70.爬楼梯.md ├── 71.简化路径.md ├── 72.编辑距离.md ├── 73.矩阵置零.md ├── 74.搜索二维矩阵.md ├── 75.颜色分类.md ├── 76.最小覆盖子串.md ├── 77.组合.md ├── 78.子集.md ├── 79.单词搜索.md ├── 8.字符串转整数 (atoi).md ├── 80.删除排序数组中的重复项 II.md ├── 81.搜索旋转排序数组 II.md ├── 82.删除排序链表中的重复元素 II.md ├── 83.删除排序链表中的重复元素.md ├── 84.柱状图中最大的矩形.md ├── 85.最大矩形.md ├── 86.分隔链表.md ├── 87.扰乱字符串.md ├── 88.合并两个有序数组.md ├── 89.格雷编码.md ├── 9.回文数.md ├── 90.子集 II.md ├── 91.解码方法.md ├── 92.反转链表 II.md ├── 93.复原IP地址.md ├── 94.二叉树的中序遍历.md ├── 95.不同的二叉搜索树 II.md ├── 96.不同的二叉搜索树.md ├── 97.交错字符串.md ├── 98.验证二叉搜索树.md └── 99.恢复二叉搜索树.md /Readme.md: -------------------------------------------------------------------------------- 1 | ## Leetcode答案 2 | 3 | ### 说明 4 | leetcode是练习算法能力修炼编程内功非常好的平台,但是官网上解题报告不全,网上的答案也有对有错,为了提升大家刷题的效率,现将每个题目的各种语言的答案(通过测试)总结发布出来,供大家参考。 5 | 6 | 每个题目包含c、c++、java、 python、 python3、 javascript、 c#、 go 8种常见语言的答案。 7 | 8 | ### 小程序 9 | 10 | github功能有限,我们开发了算法学习的小程序,方便大家学习交流, 目前功能有 11 | 12 | 1. 每个题目详细解题报告 13 | 2. 每个题目的top5答案 14 | 3. 题目收藏和标记功能 15 | 4. 题目按照标签和公司分类 16 | 17 | 18 | 19 | ### 小程序二维码 20 | 21 | 22 | 打开微信扫一扫 23 | 24 | ![](https://github.com/yooubei/leetcode_sol/blob/master/jpg/gh_883d0218850f_258.jpg) 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /jpg/gh_883d0218850f_258.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yooubei/leetcode_answer/50f4ae178de4d32dd7bde5405f7374bf25c859c2/jpg/gh_883d0218850f_258.jpg -------------------------------------------------------------------------------- /problem/110.平衡二叉树.md: -------------------------------------------------------------------------------- 1 | ### 110.平衡二叉树 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个二叉树,判断它是否是高度平衡的二叉树。


本题中,一棵高度平衡二叉树定义为:



一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。



示例 1:


给定二叉树 [3,9,20,null,null,15,7]


    3
/ \
9 20
/ \
15 7

返回 true



示例 2:


给定二叉树 [1,2,2,3,3,null,null,4,4]


       1
/ \
2 2
/ \
3 3
/ \
4 4

返回 false


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/111.二叉树的最小深度.md: -------------------------------------------------------------------------------- 1 | ### 111.二叉树的最小深度 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个二叉树,找出其最小深度。


最小深度是从根节点到最近叶子节点的最短路径上的节点数量。


说明: 叶子节点是指没有子节点的节点。


示例:


给定二叉树 [3,9,20,null,null,15,7],


    3
/ \
9 20
/ \
15 7

返回它的最小深度  2.


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/112.路径总和.md: -------------------------------------------------------------------------------- 1 | ### 112.路径总和 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。


说明: 叶子节点是指没有子节点的节点。


示例: 

给定如下二叉树,以及目标和 sum = 22


              5
/ \
4 8
/ / \
11 13 4
/ \ \
7 2 1

返回 true, 因为存在目标和为 22 的根节点到叶子节点的路径 5->4->11->2


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/113.路径总和 II.md: -------------------------------------------------------------------------------- 1 | ### 113.路径总和 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。


说明: 叶子节点是指没有子节点的节点。


示例:

给定如下二叉树,以及目标和 sum = 22


              5
/ \
4 8
/ / \
11 13 4
/ \ / \
7 2 5 1

返回:


[
[5,4,11,2],
[5,8,4,5]
]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/117.填充同一层的兄弟节点 II.md: -------------------------------------------------------------------------------- 1 | ### 117.填充同一层的兄弟节点 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个二叉树


struct TreeLinkNode {
TreeLinkNode *left;
TreeLinkNode *right;
TreeLinkNode *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL


初始状态下,所有 next 指针都被设置为 NULL


说明:



示例:


给定二叉树,


     1
/ \
2 3
/ \ \
4 5 7

调用你的函数后,该二叉树变为:


     1 -> NULL
/ \
2 -> 3 -> NULL
/ \ \
4-> 5 -> 7 -> NULL

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/118.杨辉三角.md: -------------------------------------------------------------------------------- 1 | ### 118.杨辉三角 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。



在杨辉三角中,每个数是它左上方和右上方的数的和。


示例:


输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/119.杨辉三角 II.md: -------------------------------------------------------------------------------- 1 | ### 119.杨辉三角 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。



在杨辉三角中,每个数是它左上方和右上方的数的和。


示例:


输入: 3
输出: [1,3,3,1]

进阶:


你可以优化你的算法到 O(k) 空间复杂度吗?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/134.加油站.md: -------------------------------------------------------------------------------- 1 | ### 134.加油站 2 | 3 | #### 1.题目描述 4 | 5 |

在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。


你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。


如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。


说明: 



示例 1:


输入: 
gas = [1,2,3,4,5]
cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。

示例 2:


输入: 
gas = [2,3,4]
cost = [3,4,3]
输出: -1
解释:
你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/135.分发糖果.md: -------------------------------------------------------------------------------- 1 | ### 135.分发糖果 2 | 3 | #### 1.题目描述 4 | 5 |

老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。


你需要按照以下要求,帮助老师给这些孩子分发糖果:



那么这样下来,老师至少需要准备多少颗糖果呢?


示例 1:


输入: [1,0,2]
输出: 5
解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。

示例 2:


输入: [1,2,2]
输出: 4
解释: 你可以分别给这三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这已满足上述两个条件。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/136.只出现一次的数字.md: -------------------------------------------------------------------------------- 1 | ### 136.只出现一次的数字 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。


说明:


你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?


示例 1:


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

示例 2:


输入: [4,1,2,1,2]
输出: 4

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int singleNumber(int* nums, int numsSize) { 12 | int i,temp; 13 | for(i=0;i& nums) { 29 | //XOR a^a = 0 a^0 = a 30 | int res = 0; 31 | for (auto i:nums) 32 | res = res^i; 33 | return res; 34 | } 35 | }; 36 | 37 | ``` 38 | 39 | #### java答案 40 | 41 | ```java 42 | 43 | class Solution { 44 | public int singleNumber(int[] nums) { 45 | //换个思路:(前提条件是数组长度至少为3)将数组进行从小到大的排序,无非三种情况:122xxx,直接输出第一个;222xxxx7,直接输出最后一个;夹在中间的情 况,输出中间那个比前面大比后面小的就ok 46 | int length = nums.length; 47 | int result=0; 48 | Arrays.sort(nums);//这里排序偷懒了,没有写排序的实现,是直接调用api实现的排序 49 | if(length>2){ 50 | 51 | if(nums[0]!=nums[1]){ 52 | return nums[0]; 53 | }else if(nums[length-1]!=nums[length-2]){ 54 | return nums[length-1]; 55 | }else{ 56 | for(int i = 1;i record = new Dictionary(); 95 | 96 | foreach(var n in nums){ 97 | if(record.ContainsKey(n)){ 98 | record[n] = !record[n]; 99 | }else{ 100 | record.Add(n,false); 101 | record[n] = !record[n]; 102 | } 103 | } 104 | foreach(var kvp in record){ 105 | if(kvp.Value){ 106 | return kvp.Key; 107 | } 108 | } 109 | return 0; 110 | } 111 | } 112 | 113 | ``` 114 | 115 | #### python2.x答案 116 | 117 | ```python 118 | 119 | class Solution(object): 120 | def singleNumber(self, nums): 121 | """ 122 | :type nums: List[int] 123 | :rtype: int 124 | """ 125 | return 2*sum(set(nums)) - sum(nums) 126 | # or use operator xor here, 0 xor any numer equal the number 127 | return reduce(lambda x,y: x^y, nums) 128 | 129 | 130 | 131 | ``` 132 | 133 | #### python3.x答案 134 | 135 | ```python 136 | 137 | class Solution: 138 | def singleNumber(self, nums): 139 | """ 140 | :type nums: List[int] 141 | :rtype: int 142 | """ 143 | k = 0 144 | nums.sort() 145 | for i in range(0, len(nums)-1, 2): 146 | if nums[i] == nums[i+1]: 147 | continue 148 | else: 149 | return nums[i] 150 | k = 1 151 | if k == 0: return nums[-1] 152 | 153 | ``` 154 | 155 | #### go答案 156 | 157 | ```go 158 | 159 | func singleNumber(nums []int) int { 160 | var num = 0 161 | for i:=0; i给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。


说明:



  • 拆分时可以重复使用字典中的单词。

  • 你可以假设字典中没有重复的单词。


示例 1:


输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。

示例 2:


输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"
  注意你可以重复使用字典中的单词。

示例 3:


输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/140.单词拆分 II.md: -------------------------------------------------------------------------------- 1 | ### 140.单词拆分 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,在字符串中增加空格来构建一个句子,使得句子中所有的单词都在词典中。返回所有这些可能的句子。


说明:



  • 分隔时可以重复使用字典中的单词。

  • 你可以假设字典中没有重复的单词。


示例 1:


输入:
s = "catsanddog"
wordDict = ["cat", "cats", "and", "sand", "dog"]
输出:
[
  "cats and dog",
  "cat sand dog"
]


示例 2:


输入:
s = "pineapplepenapple"
wordDict = ["apple", "pen", "applepen", "pine", "pineapple"]
输出:
[
  "pine apple pen apple",
  "pineapple pen apple",
  "pine applepen apple"
]
解释: 注意你可以重复使用字典中的单词。

示例 3:


输入:
s = "catsandog"
wordDict = ["cats", "dog", "sand", "and", "cat"]
输出:
[]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/141.环形链表.md: -------------------------------------------------------------------------------- 1 | ### 141.环形链表 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个链表,判断链表中是否有环。


进阶:

你能否不使用额外空间解决此题?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/142.环形链表 II.md: -------------------------------------------------------------------------------- 1 | ### 142.环形链表 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null


说明:不允许修改给定的链表。


进阶:

你是否可以不用额外空间解决此题?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/152.乘积最大子序列.md: -------------------------------------------------------------------------------- 1 | ### 152.乘积最大子序列 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。


示例 1:


输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:


输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/153.寻找旋转排序数组中的最小值.md: -------------------------------------------------------------------------------- 1 | ### 153.寻找旋转排序数组中的最小值 2 | 3 | #### 1.题目描述 4 | 5 |

假设按照升序排序的数组在预先未知的某个点上进行了旋转。


( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。


请找出其中最小的元素。


你可以假设数组中不存在重复元素。


示例 1:


输入: [3,4,5,1,2]
输出: 1

示例 2:


输入: [4,5,6,7,0,1,2]
输出: 0

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/154.寻找旋转排序数组中的最小值 II.md: -------------------------------------------------------------------------------- 1 | ### 154.寻找旋转排序数组中的最小值 II 2 | 3 | #### 1.题目描述 4 | 5 |

假设按照升序排序的数组在预先未知的某个点上进行了旋转。


( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。


请找出其中最小的元素。


注意数组中可能存在重复的元素。


示例 1:


输入: [1,3,5]
输出: 1

示例 2:


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

说明:



6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/16.最接近的三数之和.md: -------------------------------------------------------------------------------- 1 | ### 16.最接近的三数之和 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。


例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/162.寻找峰值.md: -------------------------------------------------------------------------------- 1 | ### 162.寻找峰值 2 | 3 | #### 1.题目描述 4 | 5 |

峰值元素是指其值大于左右相邻值的元素。


给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。


数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。


你可以假设 nums[-1] = nums[n] = -∞


示例 1:


输入: nums = [1,2,3,1]
输出: 2
解释: 3 是峰值元素,你的函数应该返回其索引 2。

示例 2:


输入: nums = [1,2,1,3,5,6,4]
输出: 1 或 5
解释: 你的函数可以返回索引 1,其峰值元素为 2;
  或者返回索引 5, 其峰值元素为 6。

说明:


你的解法应该是 O(logN) 时间复杂度的。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/164.最大间距.md: -------------------------------------------------------------------------------- 1 | ### 164.最大间距 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。


如果数组元素个数小于 2,则返回 0。


示例 1:


输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。

示例 2:


输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。

说明:



  • 你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。

  • 请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/171.Excel表列序号.md: -------------------------------------------------------------------------------- 1 | ### 171.Excel表列序号 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个Excel表格中的列名称,返回其相应的列序号。


例如,


    A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...

示例 1:


输入: "A"
输出: 1

示例 2:


输入: "AB"
输出: 28

示例 3:


输入: "ZY"
输出: 701

致谢:

特别感谢 @ts 添加此问题并创建所有测试用例。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int titleToNumber(char* s) { 12 | int ret = 0; 13 | int i = strlen(s) - 1; 14 | int base = 1; 15 | while (i > -1) { 16 | ret += (s[i] - 'A' + 1) * base; 17 | base *= 26; 18 | i--; 19 | } 20 | return ret; 21 | } 22 | 23 | ``` 24 | 25 | #### c++答案 26 | 27 | ```c++ 28 | 29 | class Solution { 30 | public: 31 | int titleToNumber(string s) { 32 | int sum=0; 33 | int n=0; 34 | for(int i=s.size()-1;i>=0;i--) 35 | { 36 | sum=sum+(s[i]-'A'+1)*pow(26.0,n); 37 | n++; 38 | } 39 | return sum; 40 | } 41 | }; 42 | 43 | ``` 44 | 45 | #### java答案 46 | 47 | ```java 48 | 49 | class Solution { 50 | public int titleToNumber(String s) { 51 | int sum = 0; 52 | for (int i = 0; i < s.length(); i++) { 53 | int temp = s.charAt(i) - 'A' + 1; 54 | temp *= Math.pow(26,s.length() - 1 - i); 55 | sum += temp; 56 | } 57 | return sum; 58 | } 59 | } 60 | 61 | ``` 62 | 63 | #### JavaScript答案 64 | 65 | ```javascript 66 | 67 | /** 68 | * @param {string} s 69 | * @return {number} 70 | */ 71 | var titleToNumber = function(s) { 72 | let arr = s.split(""); 73 | let sum = 0; 74 | arr.forEach((v,i,a)=>{ 75 | 76 | sum += 26 ** (arr.length -1 - i) * (v.charCodeAt()-65 + 1) 77 | 78 | 79 | }) 80 | return sum 81 | }; 82 | 83 | ``` 84 | 85 | #### c#答案 86 | 87 | ```c# 88 | 89 | public class Solution { 90 | public int TitleToNumber(string s) { 91 | int Res = 0; 92 | int Length = s.Length - 1; 93 | foreach(char a in s){ 94 | if(Length == 0) { 95 | Res += (int)a - 64; 96 | } 97 | else Res += ((int)a - 64)*(int)Math.Pow(26,Length); 98 | 99 | Length --; 100 | } 101 | 102 | return Res; 103 | } 104 | } 105 | 106 | ``` 107 | 108 | #### python2.x答案 109 | 110 | ```python 111 | 112 | #chr,ord ord('A')==65 113 | class Solution(object): 114 | def titleToNumber(self, s): 115 | result=0 116 | for i,l in enumerate(s[::-1]): 117 | print([i,ord('B')]) 118 | result+=(ord(l)-64)*26**i 119 | return result 120 | 121 | 122 | 123 | 124 | ``` 125 | 126 | #### python3.x答案 127 | 128 | ```python 129 | 130 | class Solution: 131 | def titleToNumber(self, s): 132 | """ 133 | :type s: str 134 | :rtype: int 135 | """ 136 | sum = 0 137 | for c in s: 138 | sum = sum*26 + ord(c) - 64 # 64 = ord('A') - 1 139 | return sum 140 | 141 | ``` 142 | 143 | #### go答案 144 | 145 | ```go 146 | 147 | func titleToNumber(s string) int { 148 | n := len(s) - 1 149 | finalNum := 0 150 | for _, v := range s { 151 | res := 1 152 | for q := 0; q < n; q++ { 153 | res = res * 26 154 | } 155 | 156 | finalNum += (int(v-64) * res) 157 | n -= 1 158 | } 159 | return finalNum 160 | 161 | } 162 | 163 | ``` -------------------------------------------------------------------------------- /problem/172.阶乘后的零.md: -------------------------------------------------------------------------------- 1 | ### 172.阶乘后的零 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数 n,返回 n! 结果尾数中零的数量。


示例 1:


输入: 3
输出: 0
解释: 3! = 6, 尾数中没有零。

示例 2:


输入: 5
输出: 1
解释: 5! = 120, 尾数中有 1 个零.

说明: 你算法的时间复杂度应为 O(log n) 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int trailingZeroes(int n) { 12 | int sum = 0; 13 | while(n >= 5) { 14 | n /= 5; 15 | sum += n; 16 | } 17 | return sum; 18 | } 19 | 20 | ``` 21 | 22 | #### c++答案 23 | 24 | ```c++ 25 | 26 | class Solution { 27 | public: 28 | int trailingZeroes(int n) { 29 | int count = 0; 30 | while (n /= 5) { 31 | count += n; 32 | } 33 | 34 | return count; 35 | } 36 | }; 37 | 38 | ``` 39 | 40 | #### java答案 41 | 42 | ```java 43 | 44 | class Solution { 45 | public int trailingZeroes(int n) { 46 | int result = 0; 47 | if(n <= 0) 48 | return result; 49 | while(n>0){ 50 | result += n/5; 51 | n/=5; 52 | } 53 | return result; 54 | } 55 | } 56 | 57 | ``` 58 | 59 | #### JavaScript答案 60 | 61 | ```javascript 62 | 63 | /** 64 | * @param {number} n 65 | * @return {number} 66 | */ 67 | var trailingZeroes = function(n) { 68 | let count = 0; 69 | let a = n 70 | while (true) { 71 | a = Math.floor(a / 5) 72 | if (a == 0) { 73 | break 74 | } else { 75 | count += a 76 | } 77 | } 78 | return count 79 | }; 80 | 81 | ``` 82 | 83 | #### c#答案 84 | 85 | ```c# 86 | 87 | public class Solution { 88 | public int TrailingZeroes(int n) { 89 | int sum = 0; 90 | while(n > 0) 91 | { 92 | sum += n / 5; 93 | n = n / 5; 94 | } 95 | return sum; 96 | } 97 | } 98 | 99 | ``` 100 | 101 | #### python2.x答案 102 | 103 | ```python 104 | 105 | class Solution(object): 106 | def trailingZeroes(self, n): 107 | """ 108 | :type n: int 109 | :rtype: int 110 | """ 111 | import time 112 | start=time.time() 113 | 114 | n_5=0 115 | while n>0: 116 | n//=5 117 | n_5+=n 118 | 119 | return n_5 120 | 121 | ``` 122 | 123 | #### python3.x答案 124 | 125 | ```python 126 | 127 | class Solution: 128 | def trailingZeroes(self, n): 129 | """ 130 | :type n: int 131 | :rtype: int 132 | """ 133 | count = 0 134 | while (n) : 135 | count += n // 5 136 | n = n // 5 137 | return count 138 | 139 | ``` 140 | 141 | #### go答案 142 | 143 | ```go 144 | 145 | func trailingZeroes(n int) int { 146 | // 先数有多少个5,再数有多少个25,再数有多少个125...加到一起就是总数 147 | i := 0 148 | for power5(i) < n{ 149 | i+=1 150 | } 151 | count := 0 152 | fmt.Println(i) 153 | for i >0{ 154 | count += n / power5(i) 155 | i-- 156 | } 157 | return count 158 | } 159 | 160 | func power5( n int)int{ 161 | res := 1 162 | for n > 0{ 163 | res *= 5 164 | n-- 165 | } 166 | return res 167 | } 168 | 169 | ``` -------------------------------------------------------------------------------- /problem/174.地下城游戏.md: -------------------------------------------------------------------------------- 1 | ### 174.地下城游戏 2 | 3 | #### 1.题目描述 4 | 5 |

一些恶魔抓住了公主(P)并将她关在了地下城的右下角。地下城是由 M x N 个房间组成的二维网格。我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主。

6 |
7 |

骑士的初始健康点数为一个正整数。如果他的健康点数在某一时刻降至 0 或以下,他会立即死亡。

8 |
9 |

有些房间由恶魔守卫,因此骑士在进入这些房间时会失去健康点数(若房间里的值为负整数,则表示骑士将损失健康点数);其他房间要么是空的(房间里的值为 0),要么包含增加骑士健康点数的魔法球(若房间里的值为正整数,则表示骑士将增加健康点数)。

10 |
11 |

为了尽快到达公主,骑士决定每次只向右或向下移动一步。

12 |
13 |

 

14 |
15 |

编写一个函数来计算确保骑士能够拯救到公主所需的最低初始健康点数。

16 |
17 |

例如,考虑到如下布局的地下城,如果骑士遵循最佳路径 右 -> 右 -> 下 -> 下,则骑士的初始健康点数至少为 7

18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
-2 (K)-33
-5-101
1030-5 (P)
36 |
39 |
40 |

 

41 |
42 |

说明:

43 |
44 |
    45 |
  • 46 |

    骑士的健康点数没有上限。

    47 |
  • 48 |
  • 任何房间都可能对骑士的健康点数造成威胁,也可能增加骑士的健康点数,包括骑士进入的左上角房间以及公主被监禁的右下角房间。
  • 49 |
50 | 51 | #### c答案 52 | 53 | ```c 54 | 55 | -------------------------------------------------------------------------------- /problem/189.旋转数组.md: -------------------------------------------------------------------------------- 1 | ### 189.旋转数组 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。


示例 1:


输入: [1,2,3,4,5,6,7]k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

示例 2:


输入: [-1,-100,3,99]k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]

说明:



  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。

  • 要求使用空间复杂度为 O(1) 的原地算法。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/190.颠倒二进制位.md: -------------------------------------------------------------------------------- 1 | ### 190.颠倒二进制位 2 | 3 | #### 1.题目描述 4 | 5 |

颠倒给定的 32 位无符号整数的二进制位。


示例:


输入: 43261596
输出: 964176192
解释: 43261596 的二进制表示形式为 00000010100101000001111010011100
  返回 964176192,其二进制表示形式为 00111001011110000010100101000000

进阶:

如果多次调用这个函数,你将如何优化你的算法?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/191.位1的个数.md: -------------------------------------------------------------------------------- 1 | ### 191.位1的个数 2 | 3 | #### 1.题目描述 4 | 5 |

编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。


示例 :


输入: 11
输出: 3
解释: 整数 11 的二进制表示为 00000000000000000000000000001011

 


示例 2:


输入: 128
输出: 1
解释: 整数 128 的二进制表示为 00000000000000000000000010000000

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int hammingWeight(uint32_t n) { 12 | int c = 0; 13 | 14 | while(n) 15 | { 16 | n = (n & (n - 1)); 17 | c++; 18 | } 19 | 20 | return c; 21 | } 22 | 23 | ``` 24 | 25 | #### c++答案 26 | 27 | ```c++ 28 | 29 | class Solution { 30 | public: 31 | int hammingWeight(uint32_t n) { 32 | 33 | int result=0; 34 | bool run=true; 35 | while (run) 36 | { 37 | int d = n % 2; 38 | if (d==1) 39 | { 40 | result++; 41 | } 42 | n = n / 2; 43 | if (n==0) 44 | { 45 | run = false; 46 | } 47 | } 48 | return result; 49 | 50 | } 51 | }; 52 | 53 | ``` 54 | 55 | #### java答案 56 | 57 | ```java 58 | 59 | public class Solution { 60 | // you need to treat n as an unsigned value 61 | public int hammingWeight(int n) { 62 | int ans=0; 63 | String s=Integer.toBinaryString(n); 64 | for(char i:s.toCharArray()) 65 | { 66 | if(i=='1') 67 | ans++; 68 | } 69 | return ans; 70 | 71 | } 72 | } 73 | 74 | ``` 75 | 76 | #### JavaScript答案 77 | 78 | ```javascript 79 | 80 | /** 81 | * @param {number} n - a positive integer 82 | * @return {number} 83 | */ 84 | var hammingWeight = function(n) { 85 | var str=n.toString(2); 86 | var num=0; 87 | for(var i=0;i 0){ 105 | if(n%2 == 1) 106 | hmw++; 107 | n /= 2; 108 | } 109 | return hmw; 110 | } 111 | } 112 | 113 | ``` 114 | 115 | #### python2.x答案 116 | 117 | ```python 118 | 119 | class Solution(object): 120 | def hammingWeight(self, n): 121 | """ 122 | :type n: int 123 | :rtype: int 124 | """ 125 | length = len(bin(n))-2 126 | print(length) 127 | n = '{:032b}'.format(n) 128 | n = n[::-1] 129 | m = 0 130 | for i in range(length): 131 | if n[i] == '1': 132 | m += 1 133 | return m 134 | 135 | ``` 136 | 137 | #### python3.x答案 138 | 139 | ```python 140 | 141 | -------------------------------------------------------------------------------- /problem/201.数字范围按位与.md: -------------------------------------------------------------------------------- 1 | ### 201.数字范围按位与 2 | 3 | #### 1.题目描述 4 | 5 |

给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。


示例 1: 


输入: [5,7]
输出: 4

示例 2:


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

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int rangeBitwiseAnd(int m, int n) { 12 | int a = 0; 13 | while (n != m) { 14 | n = n >> 1; 15 | m = m >> 1; 16 | a++; 17 | } 18 | 19 | return (n << a); 20 | 21 | } 22 | 23 | ``` 24 | 25 | #### c++答案 26 | 27 | ```c++ 28 | 29 | class Solution { 30 | public: 31 | int rangeBitwiseAnd(int m, int n) { 32 | int count=0; 33 | 34 | if(m==0 || m==n) 35 | return m; 36 | 37 | while(n>m && m>0) 38 | { 39 | count++; 40 | m >>= 1; 41 | n >>= 1; 42 | } 43 | 44 | return m< 0 && n > 0) 61 | return m << i; 62 | 63 | m >>= 1; 64 | n >>= 1; 65 | 66 | if (m < 1 || n < 1) 67 | return 0; 68 | } 69 | } 70 | } 71 | 72 | ``` 73 | 74 | #### JavaScript答案 75 | 76 | ```javascript 77 | 78 | /** 79 | * @param {number} m 80 | * @param {number} n 81 | * @return {number} 82 | */ 83 | var rangeBitwiseAnd = function (m, n) { 84 | if (m === n) { 85 | return m; 86 | } 87 | let root = 0; 88 | while (m !== n) { 89 | root += 1; 90 | m >>= 1; 91 | n >>= 1; 92 | } 93 | return (n <<= root); 94 | }; 95 | 96 | 97 | ``` 98 | 99 | #### c#答案 100 | 101 | ```c# 102 | 103 | public class Solution { 104 | public int RangeBitwiseAnd(int m, int n) { 105 | int k=0; 106 | while((m>>k)!=(n>>k)){ 107 | k++; 108 | } 109 | return (m>>k)<= (1 << i): # n - m >= 2 ** i 133 | bit = 0 134 | else: 135 | bit = 1 136 | if bit == 1: 137 | ret = ret | mask 138 | mask <<= 1 139 | 140 | return ret 141 | 142 | ``` 143 | 144 | #### python3.x答案 145 | 146 | ```python 147 | 148 | class Solution: 149 | def rangeBitwiseAnd(self, m, n): 150 | """ 151 | :type m: int 152 | :type n: int 153 | :rtype: int 154 | """ 155 | #https://blog.csdn.net/u014673347/article/details/46944469 156 | #https://blog.csdn.net/youthinkwu/article/details/50822937 157 | bit = 0 158 | while m != n: 159 | 160 | m >>= 1 161 | n >>= 1 162 | bit+=1 163 | 164 | return m << bit 165 | 166 | ``` 167 | 168 | #### go答案 169 | 170 | ```go 171 | 172 | func rangeBitwiseAnd(m int, n int) int { 173 | var i uint 174 | i=0 175 | for n!=m{ 176 | n=n>>1 177 | m=m>>1 178 | i++ 179 | } 180 | return m<你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警


给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。


示例 1:


输入: [2,3,2]
输出: 3
解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

示例 2:


输入: [1,2,3,1]
输出: 4
解释: 你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
  偷窃到的最高金额 = 1 + 3 = 4 。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/214.最短回文串.md: -------------------------------------------------------------------------------- 1 | ### 214.最短回文串 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。


示例 1:


输入: "aacecaaa"
输出: "aaacecaaa"

示例 2:


输入: "abcd"
输出: "dcbabcd"

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/215.数组中的第K个最大元素.md: -------------------------------------------------------------------------------- 1 | ### 215.数组中的第K个最大元素 2 | 3 | #### 1.题目描述 4 | 5 |

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。


示例 1:


输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

示例 2:


输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

说明:


你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/216.组合总和 III.md: -------------------------------------------------------------------------------- 1 | ### 216.组合总和 III 2 | 3 | #### 1.题目描述 4 | 5 |

找出所有相加之和为 n 的 个数的组合组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。


说明:



  • 所有数字都是正整数。

  • 解集不能包含重复的组合。 


示例 1:


输入: k = 3, n = 7
输出: [[1,2,4]]

示例 2:


输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/217.存在重复元素.md: -------------------------------------------------------------------------------- 1 | ### 217.存在重复元素 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数数组,判断是否存在重复元素。


如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。


示例 1:


输入: [1,2,3,1]
输出: true

示例 2:


输入: [1,2,3,4]
输出: false

示例 3:


输入: [1,1,1,3,3,4,3,2,4,2]
输出: true

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/223.矩形面积.md: -------------------------------------------------------------------------------- 1 | ### 223.矩形面积 2 | 3 | #### 1.题目描述 4 | 5 |

二维平面上计算出两个由直线构成的矩形重叠后形成的总面积。


每个矩形由其左下顶点和右上顶点坐标表示,如图所示。


Rectangle Area


示例:


输入: -3, 0, 3, 4, 0, -1, 9, 2 输出: 45


说明: 假设矩形面积不会超出 int 的范围。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/224.基本计算器.md: -------------------------------------------------------------------------------- 1 | ### 224.基本计算器 2 | 3 | #### 1.题目描述 4 | 5 |

实现一个基本的计算器来计算一个简单的字符串表达式的值。


字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -非负整数和空格  


示例 1:


输入: "1 + 1"
输出: 2

示例 2:


输入: " 2-1 + 2 "
输出: 3

示例 3:


输入: "(1+(4+5+2)-3)+(6+8)"
输出: 23

说明:



  • 你可以假设所给定的表达式都是有效的。

  • 不要使用内置的库函数 eval


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/225.用队列实现栈.md: -------------------------------------------------------------------------------- 1 | ### 225.用队列实现栈 2 | 3 | #### 1.题目描述 4 | 5 |

使用队列实现栈的下列操作:



  • push(x) -- 元素 x 入栈

  • pop() -- 移除栈顶元素

  • top() -- 获取栈顶元素

  • empty() -- 返回栈是否为空


注意:



  • 你只能使用队列的基本操作-- 也就是 push to back, peek/pop from front, size, 和 is empty 这些操作是合法的。

  • 你所使用的语言也许不支持队列。 你可以使用 list 或者 deque(双端队列)来模拟一个队列 , 只要是标准的队列操作即可。

  • 你可以假设所有操作都是有效的(例如, 对一个空的栈不会调用 pop 或者 top 操作)。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/226.翻转二叉树.md: -------------------------------------------------------------------------------- 1 | ### 226.翻转二叉树 2 | 3 | #### 1.题目描述 4 | 5 |

翻转一棵二叉树。


示例:


输入:


     4
/ \
2 7
/ \ / \
1 3 6 9

输出:


     4
/ \
7 2
/ \ / \
9 6 3 1

备注:

这个问题是受到 Max Howell 原问题 启发的 :


谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/231.2的幂.md: -------------------------------------------------------------------------------- 1 | ### 231.2的幂 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。


示例 1:


输入: 1
输出: true
解释: 20 = 1

示例 2:


输入: 16
输出: true
解释: 24 = 16

示例 3:


输入: 218
输出: false

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | bool isPowerOfTwo(int n) { 12 | if(n<=0) 13 | return 0; 14 | else 15 | return (n&n-1)==0?1:0; 16 | 17 | } 18 | 19 | ``` 20 | 21 | #### c++答案 22 | 23 | ```c++ 24 | 25 | class Solution { 26 | public: 27 | bool isPowerOfTwo(int n) { 28 | int cnt = 0; 29 | while (n > 0) { 30 | cnt += (n & 1); 31 | n >>= 1; 32 | } 33 | return cnt == 1; 34 | } 35 | }; 36 | 37 | ``` 38 | 39 | #### java答案 40 | 41 | ```java 42 | 43 | class Solution { 44 | public boolean isPowerOfTwo(int n) { 45 | if(n == 0) 46 | return false; 47 | while(n!=1){ 48 | if(n%2==0) 49 | n/=2; 50 | else 51 | return false; 52 | } 53 | return true; 54 | } 55 | } 56 | 57 | ``` 58 | 59 | #### JavaScript答案 60 | 61 | ```javascript 62 | 63 | /** 64 | * @param {number} n 65 | * @return {boolean} 66 | */ 67 | var isPowerOfTwo = function(n) { 68 | var a = 0 69 | var b = 0 70 | var c = 0 71 | var d = 0 72 | var e = 0 73 | for(var i=0;i<50;i++){ 74 | a = Math.pow(2,i) 75 | if(n==a){ 76 | return true 77 | } 78 | } 79 | return false 80 | }; 81 | 82 | ``` 83 | 84 | #### c#答案 85 | 86 | ```c# 87 | 88 | public class Solution { 89 | public bool IsPowerOfTwo(int n) { 90 | if (n <= 0) return false; 91 | int result = 0; 92 | for (int i = 0; i < 32; i++) 93 | { 94 | if (((n >> i) & 1).Equals(1)) 95 | { 96 | result++; 97 | } 98 | if (result > 1) 99 | { 100 | return false; 101 | } 102 | } 103 | return true; 104 | } 105 | } 106 | 107 | ``` 108 | 109 | #### python2.x答案 110 | 111 | ```python 112 | 113 | class Solution(object): 114 | def isPowerOfTwo(self, n): 115 | """ 116 | :type n: int 117 | :rtype: bool 118 | """ 119 | if n < 1: 120 | return False 121 | if n == 1: 122 | return True 123 | m = 0 124 | while n > 1: 125 | m = n % 2 126 | if m != 0: 127 | return False 128 | n = n // 2 129 | return True 130 | 131 | ``` 132 | 133 | #### python3.x答案 134 | 135 | ```python 136 | 137 | class Solution: 138 | def isPowerOfTwo(self, n): 139 | """ 140 | :type n: int 141 | :rtype: bool 142 | """ 143 | while n > 0: 144 | if n % 2 == 0: 145 | n = n // 2 146 | else: 147 | if n == 1: 148 | return True 149 | else: 150 | return False 151 | return False 152 | 153 | ``` 154 | 155 | #### go答案 156 | 157 | ```go 158 | 159 | func isPowerOfTwo(n int) bool { 160 | if n<= 0 { 161 | return false 162 | } 163 | if n&(n-1) != 0 { 164 | return false 165 | } 166 | return true 167 | } 168 | 169 | ``` -------------------------------------------------------------------------------- /problem/239.滑动窗口最大值.md: -------------------------------------------------------------------------------- 1 | ### 239.滑动窗口最大值 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个数组 nums,有一个大小为 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口 k 内的数字。滑动窗口每次只向右移动一位。


返回滑动窗口最大值。


示例:


输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
解释:

滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

注意:


你可以假设 k 总是有效的,1 ≤ k ≤ 输入数组的大小,且输入数组不为空。


进阶:


你能在线性时间复杂度内解决此题吗?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/240.搜索二维矩阵 II.md: -------------------------------------------------------------------------------- 1 | ### 240.搜索二维矩阵 II 2 | 3 | #### 1.题目描述 4 | 5 |

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:



  • 每行的元素从左到右升序排列。

  • 每列的元素从上到下升序排列。


示例:


现有矩阵 matrix 如下:


[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]

给定 target = 5,返回 true


给定 target = 20,返回 false


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/241.为运算表达式设计优先级.md: -------------------------------------------------------------------------------- 1 | ### 241.为运算表达式设计优先级 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +- 以及 * 。


示例 1:


输入: "2-1-1"
输出: [0, 2]
解释:
((2-1)-1) = 0
(2-(1-1)) = 2

示例 2:


输入: "2*3-4*5"
输出: [-34, -14, -10, -10, 10]
解释:
(2*(3-(4*5))) = -34
((2*3)-(4*5)) = -14
((2*(3-4))*5) = -10
(2*((3-4)*5)) = -10
(((2*3)-4)*5) = 10

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/279.完全平方数.md: -------------------------------------------------------------------------------- 1 | ### 279.完全平方数 2 | 3 | #### 1.题目描述 4 | 5 |

给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。


示例 1:


输入: n = 12
输出: 3
解释: 12 = 4 + 4 + 4.

示例 2:


输入: n = 13
输出: 2
解释: 13 = 4 + 9.

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/282.给表达式添加运算符.md: -------------------------------------------------------------------------------- 1 | ### 282.给表达式添加运算符 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个仅包含数字 0-9 的字符串和一个目标值,在数字之间添加二元运算符(不是一元)+- 或 * ,返回所有能够得到目标值的表达式。


示例 1:


输入: num = "123", target = 6
输出: ["1+2+3", "1*2*3"]

示例 2:


输入: num = "232", target = 8
输出: ["2*3+2", "2+3*2"]

示例 3:


输入: num = "105", target = 5
输出: ["1*0+5","10-5"]

示例 4:


输入: num = "00", target = 0
输出: ["0+0", "0-0", "0*0"]

示例 5:


输入: num = "3456237490", target = 9191
输出: []

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/283.移动零.md: -------------------------------------------------------------------------------- 1 | ### 283.移动零 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。


示例:


输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:



  1. 必须在原数组上操作,不能拷贝额外的数组。

  2. 尽量减少操作次数。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/284.顶端迭代器.md: -------------------------------------------------------------------------------- 1 | ### 284.顶端迭代器 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个迭代器类的接口,接口包含两个方法: next() 和 hasNext()。设计并实现一个支持 peek() 操作的顶端迭代器 -- 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。


示例:


假设迭代器被初始化为列表 [1,2,3]
调用 next() 返回 1,得到列表中的第一个元素。
现在调用 peek() 返回 2,下一个元素。在此之后调用 next() 仍然返回 2
最后一次调用 next() 返回 3,末尾元素。在此之后调用 hasNext() 应该返回 false

进阶:你将如何拓展你的设计?使之变得通用化,从而适应所有的类型,而不只是整数型?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/287.寻找重复数.md: -------------------------------------------------------------------------------- 1 | ### 287.寻找重复数 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。


示例 1:


输入: [1,3,4,2,2]
输出: 2

示例 2:


输入: [3,1,3,4,2]
输出: 3

说明:



  1. 不能更改原数组(假设数组是只读的)。

  2. 只能使用额外的 O(1) 的空间。

  3. 时间复杂度小于 O(n2) 。

  4. 数组中只有一个重复的数字,但它可能不止重复出现一次。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/292.Nim游戏.md: -------------------------------------------------------------------------------- 1 | ### 292.Nim游戏 2 | 3 | #### 1.题目描述 4 | 5 |

你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。


你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。


示例:


输入: 4
输出: false
解释: 如果堆中有 4 块石头,那么你永远不会赢得比赛;
  因为无论你拿走 1 块、2 块 还是 3 块石头,最后一块石头总是会被你的朋友拿走。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | bool canWinNim(int n) { 12 | return n % 4 != 0; 13 | } 14 | 15 | ``` 16 | 17 | #### c++答案 18 | 19 | ```c++ 20 | 21 | class Solution { 22 | public: 23 | bool canWinNim(int n) { 24 | return n%4; 25 | } 26 | }; 27 | 28 | ``` 29 | 30 | #### java答案 31 | 32 | ```java 33 | 34 | class Solution { 35 | public boolean canWinNim(int n) { 36 | if(n%4!=0){return true;} 37 | else return false; 38 | } 39 | } 40 | 41 | ``` 42 | 43 | #### JavaScript答案 44 | 45 | ```javascript 46 | 47 | /** 48 | * @param {number} n 49 | * @return {boolean} 50 | */ 51 | var canWinNim = function(n) { 52 | if (n%4 == 0) { 53 | return false 54 | } else { 55 | return true 56 | } 57 | }; 58 | 59 | ``` 60 | 61 | #### c#答案 62 | 63 | ```c# 64 | 65 | public class Solution { 66 | public bool CanWinNim(int n) { 67 | return (n%4!=0); 68 | } 69 | } 70 | 71 | ``` 72 | 73 | #### python2.x答案 74 | 75 | ```python 76 | 77 | class Solution(object): 78 | def canWinNim(self, n): 79 | """ 80 | :type n: int 81 | :rtype: bool 82 | """ 83 | if n%4 == 0: 84 | return False 85 | else: 86 | return True 87 | 88 | ``` 89 | 90 | #### python3.x答案 91 | 92 | ```python 93 | 94 | class Solution: 95 | def canWinNim(self, n): 96 | """ 97 | :type n: int 98 | :rtype: bool 99 | """ 100 | if n%4!=0 or n<=3: 101 | return True 102 | else: 103 | return False 104 | 105 | 106 | 107 | 108 | ``` 109 | 110 | #### go答案 111 | 112 | ```go 113 | 114 | func canWinNim(n int) bool { 115 | lastNum := n % 4 116 | 117 | if lastNum == 0 { 118 | return false 119 | } 120 | return true 121 | } 122 | 123 | ``` -------------------------------------------------------------------------------- /problem/297.二叉树的序列化与反序列化.md: -------------------------------------------------------------------------------- 1 | ### 297.二叉树的序列化与反序列化 2 | 3 | #### 1.题目描述 4 | 5 |

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。


请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。


示例: 


你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"

提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。


说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/301.删除无效的括号.md: -------------------------------------------------------------------------------- 1 | ### 301.删除无效的括号 2 | 3 | #### 1.题目描述 4 | 5 |

删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。


说明: 输入可能包含了除 ( 和 ) 以外的字符。


示例 1:


输入: "()())()"
输出: ["()()()", "(())()"]

示例 2:


输入: "(a)())()"
输出: ["(a)()()", "(a())()"]

示例 3:


输入: ")("
输出: [""]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/303.区域和检索 - 数组不可变.md: -------------------------------------------------------------------------------- 1 | ### 303.区域和检索 - 数组不可变 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数数组  nums,求出数组从索引 到 j  (i ≤ j) 范围内元素的总和,包含 i,  j 两点。


示例:


给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()
sumRange(0, 2) -> 1
sumRange(2, 5) -> -1
sumRange(0, 5) -> -3

说明:



  1. 你可以假设数组不可变。

  2. 会多次调用 sumRange 方法。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/304.二维区域和检索 - 矩阵不可变.md: -------------------------------------------------------------------------------- 1 | ### 304.二维区域和检索 - 矩阵不可变 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个二维矩阵,计算其子矩形范围内元素的总和,该子矩阵的左上角为 (row1, col1) ,右下角为 (row2, col2)。


Range Sum Query 2D

上图子矩阵左上角 (row1, col1) = (2, 1) ,右下角(row2, col2) = (4, 3),该子矩形内元素的总和为 8。


示例:


给定 matrix = [
[3, 0, 1, 4, 2],
[5, 6, 3, 2, 1],
[1, 2, 0, 1, 5],
[4, 1, 0, 1, 7],
[1, 0, 3, 0, 5]
]
sumRegion(2, 1, 4, 3) -> 8
sumRegion(1, 1, 2, 2) -> 11
sumRegion(1, 2, 2, 4) -> 12

说明:



  1. 你可以假设矩阵不可变。

  2. 会多次调用 sumRegion 方法

  3. 你可以假设 row1 ≤ row2 且 col1 ≤ col2。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/306.累加数.md: -------------------------------------------------------------------------------- 1 | ### 306.累加数 2 | 3 | #### 1.题目描述 4 | 5 |

累加数是一个字符串,组成它的数字可以形成累加序列。


一个有效的累加序列必须至少包含 3 个数。除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和。


给定一个只包含数字 '0'-'9' 的字符串,编写一个算法来判断给定输入是否是累加数。


说明: 累加序列里的数不会以 0 开头,所以不会出现 1, 2, 03 或者 1, 02, 3 的情况。


示例 1:


输入: "112358"
输出: true
解释: 累加序列为: 1, 1, 2, 3, 5, 8 。1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5, 3 + 5 = 8

示例 2:


输入: "199100199"
输出: true
解释: 累加序列为: 1, 99, 100, 199。1 + 99 = 100, 99 + 100 = 199

进阶:

你如何处理一个溢出的过大的整数输入?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/318.最大单词长度乘积.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yooubei/leetcode_answer/50f4ae178de4d32dd7bde5405f7374bf25c859c2/problem/318.最大单词长度乘积.md -------------------------------------------------------------------------------- /problem/319.灯泡开关.md: -------------------------------------------------------------------------------- 1 | ### 319.灯泡开关 2 | 3 | #### 1.题目描述 4 | 5 |

初始时有 个灯泡关闭。 第 1 轮,你打开所有的灯泡。 第 2 轮,每两个灯泡你关闭一次。 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭)。第 i 轮,每 个灯泡切换一次开关。 对于第 轮,你只切换最后一个灯泡的开关。 找出 轮后有多少个亮着的灯泡。


示例:


输入: 3
输出: 1
解释:
初始时, 灯泡状态 [关闭, 关闭, 关闭].
第一轮后, 灯泡状态 [开启, 开启, 开启].
第二轮后, 灯泡状态 [开启, 关闭, 开启].
第三轮后, 灯泡状态 [开启, 关闭, 关闭].
你应该返回 1,因为只有一个灯泡还亮着。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int bulbSwitch(int n) { 12 | return (int)sqrt(n); 13 | } 14 | 15 | ``` 16 | 17 | #### c++答案 18 | 19 | ```c++ 20 | 21 | class Solution { 22 | public: 23 | int bulbSwitch(int n) { 24 | return sqrt(n); 25 | } 26 | }; 27 | 28 | ``` 29 | 30 | #### java答案 31 | 32 | ```java 33 | 34 | class Solution { 35 | public int bulbSwitch(int n) { 36 | int count = 0; 37 | for(int i = 1; i * i <= n; i ++){ 38 | if(i * i <= n) 39 | count ++; 40 | } 41 | return count; 42 | } 43 | } 44 | 45 | ``` 46 | 47 | #### JavaScript答案 48 | 49 | ```javascript 50 | 51 | /** 52 | * @param {number} n 53 | * @return {number} 54 | */ 55 | var bulbSwitch = function(n) { 56 | return ~~(n ** .5); 57 | }; 58 | 59 | ``` 60 | 61 | #### c#答案 62 | 63 | ```c# 64 | 65 | public class Solution { 66 | public int BulbSwitch(int n) { 67 | return (int)(Math.Sqrt(n)); 68 | } 69 | } 70 | 71 | ``` 72 | 73 | #### python2.x答案 74 | 75 | ```python 76 | 77 | class Solution(object): 78 | def bulbSwitch(self, n): 79 | """ 80 | :type n: int 81 | :rtype: int 82 | """ 83 | from math import sqrt 84 | return int(sqrt(n)) 85 | 86 | 87 | ``` 88 | 89 | #### python3.x答案 90 | 91 | ```python 92 | 93 | class Solution: 94 | def bulbSwitch(self, n): 95 | """ 96 | :type n: int 97 | :rtype: int 98 | """ 99 | return int(math.sqrt(n)) 100 | 101 | ``` 102 | 103 | #### go答案 104 | 105 | ```go 106 | 107 | 108 | func bulbSwitch(n int) int { 109 | for i:=1;i<=n;i++{ 110 | if i*i==n{ 111 | return i 112 | }else if i*i>n{ 113 | return i-1 114 | } 115 | 116 | } 117 | return 0 118 | } 119 | 120 | /* 121 | 122 | i=1 0,1,2,3,4,5 全部打开 123 | i=2 1,3,5 124 | i=3 2,5 125 | i=4 3 126 | i=5 4 127 | i=6 5 128 | 0,1,2,3,4,5 129 | 1,2,2,3,2,4 130 | 131 | 132 | 133 | */ 134 | 135 | 136 | ``` -------------------------------------------------------------------------------- /problem/321.拼接最大数.md: -------------------------------------------------------------------------------- 1 | ### 321.拼接最大数 2 | 3 | #### 1.题目描述 4 | 5 |

给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。


求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。


说明: 请尽可能地优化你算法的时间和空间复杂度。


示例 1:


输入:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
输出:
[9, 8, 6, 5, 3]

示例 2:


输入:
nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
输出:
[6, 7, 6, 0, 4]

示例 3:


输入:
nums1 = [3, 9]
nums2 = [8, 9]
k = 3
输出:
[9, 8, 9]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/322.零钱兑换.md: -------------------------------------------------------------------------------- 1 | ### 322.零钱兑换 2 | 3 | #### 1.题目描述 4 | 5 |

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1


示例 1:


输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1

示例 2:


输入: coins = [2], amount = 3
输出: -1

说明:

你可以认为每种硬币的数量是无限的。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/324.摆动排序 II.md: -------------------------------------------------------------------------------- 1 | ### 324.摆动排序 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。


示例 1:


输入: nums = [1, 5, 1, 1, 6, 4]
输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]

示例 2:


输入: nums = [1, 3, 2, 2, 3, 1]
输出: 一个可能的答案是 [2, 3, 1, 3, 1, 2]

说明:

你可以假设所有输入都会得到有效的结果。


进阶:

你能用 O(n) 时间复杂度和 / 或原地 O(1) 额外空间来实现吗?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/326.3的幂.md: -------------------------------------------------------------------------------- 1 | ### 326.3的幂 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数,写一个函数来判断它是否是 3 的幂次方。


示例 1:


输入: 27
输出: true

示例 2:


输入: 0
输出: false

示例 3:


输入: 9
输出: true

示例 4:


输入: 45
输出: false

进阶:

你能不使用循环或者递归来完成本题吗?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | bool isPowerOfThree(int n) { 12 | if(n<=0) 13 | return false; 14 | int i; 15 | for(i = 0; i < 21; i++) 16 | { 17 | if(pow(3, i) == n) 18 | return true; 19 | } 20 | return false; 21 | } 22 | 23 | ``` 24 | 25 | #### c++答案 26 | 27 | ```c++ 28 | 29 | static const auto _=[]() { 30 | std::ios::sync_with_stdio(false); 31 | std::cin.tie(nullptr); 32 | return nullptr; 33 | }(); 34 | 35 | class Solution { 36 | public: 37 | bool isPowerOfThree(int n) { 38 | if(n<=0) 39 | return false; 40 | int q,r; 41 | while(n>1) { 42 | q=n/3; 43 | r=n-3*q; 44 | if(r!=0) 45 | return false; 46 | n=q; 47 | } 48 | return true; 49 | } 50 | }; 51 | 52 | ``` 53 | 54 | #### java答案 55 | 56 | ```java 57 | 58 | class Solution { 59 | public boolean isPowerOfThree(int n) { 60 | if(n <= 0) 61 | return false; 62 | int maxPower = (int) Math.pow(3,(int)(Math.log(0x7fffffff)/Math.log(3))); 63 | if (maxPower % n == 0) 64 | return true; 65 | else 66 | return false; 67 | } 68 | } 69 | 70 | ``` 71 | 72 | #### JavaScript答案 73 | 74 | ```javascript 75 | 76 | /** 77 | * @param {number} n 78 | * @return {boolean} 79 | */ 80 | var isPowerOfThree = function(n) { 81 | while (n > 2) { 82 | if (n % 3 == 0) { 83 | n /= 3; 84 | } else { 85 | return false; 86 | } 87 | } 88 | return n == 1; 89 | }; 90 | 91 | ``` 92 | 93 | #### c#答案 94 | 95 | ```c# 96 | 97 | public class Solution { 98 | public bool IsPowerOfThree(int n) { 99 | if (n==1) return true; 100 | var dN = (double)n ; 101 | var count = 0; 102 | while (dN > 3 ) 103 | { 104 | dN/=3; 105 | n/=3; 106 | if (dN!=n) 107 | { 108 | return false; 109 | } 110 | count++; 111 | } 112 | if (dN!=3) 113 | { 114 | return false; 115 | } 116 | return true; 117 | } 118 | } 119 | 120 | ``` 121 | 122 | #### python2.x答案 123 | 124 | ```python 125 | 126 | class Solution(object): 127 | def isPowerOfThree(self, n): 128 | """ 129 | :type n: int 130 | :rtype: bool 131 | """ 132 | 133 | while n%3 == 0 and n > 1: 134 | n = n/3 135 | 136 | return n==1 137 | 138 | 139 | ``` 140 | 141 | #### python3.x答案 142 | 143 | ```python 144 | 145 | class Solution: 146 | def isPowerOfThree(self, n): 147 | """ 148 | :type n: int 149 | :rtype: bool 150 | """ 151 | return n > 0 and 1162261467 % n == 0 152 | 153 | ``` 154 | 155 | #### go答案 156 | 157 | ```go 158 | 159 | func isPowerOfThree(n int) bool { 160 | return n > 0 && 1162261467%n == 0; 161 | } 162 | 163 | ``` -------------------------------------------------------------------------------- /problem/327.区间和的个数.md: -------------------------------------------------------------------------------- 1 | ### 327.区间和的个数 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper

区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (ij)。


说明:

最直观的算法复杂度是 O(n2) ,请在此基础上优化你的算法。


示例:


输入: nums = [-2,5,-1], lower = -2, upper = 2,
输出: 3
解释: 3个区间分别是: [0,0], [2,2], [0,2],它们表示的和分别为: -2, -1, 2。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int countRangeSum(int* nums, int numsSize, int lower, int upper) { 12 | int result = 0; 13 | for (int i = 0; i < numsSize; ++i) { 14 | long sum = 0; 15 | for(int j = i; j < numsSize;j++){ 16 | sum += *(nums+j); 17 | if(sum<=upper&&sum>=lower){ 18 | result++; 19 | } 20 | } 21 | } 22 | return result; 23 | } 24 | 25 | ``` 26 | 27 | #### c++答案 28 | 29 | ```c++ 30 | 31 | class Solution { 32 | public: 33 | int countRangeSum(vector& nums, int lower, int upper) { 34 | int res = 0; 35 | long long sum = 0; 36 | multiset sums; 37 | sums.insert(0); 38 | for(int i=0; i= r) return 0; 62 | int mid = l + (r-l)/2; 63 | int left = merge(nums,aux,l,mid,lower,upper); 64 | int right = merge(nums,aux,mid+1,r,lower,upper); 65 | return left + right + merge(nums,aux,l,mid,r,lower,upper); 66 | } 67 | public int merge(long[] nums,long[] aux,int l,int mid,int r,int lower,int upper) { 68 | int res = 0; 69 | for(int i=l,j=mid+1,k=l,t=mid+1,p=mid+1;i<=mid || j<= r;) { 70 | if(i > mid) { 71 | aux[k++] = nums[j++]; 72 | }else if(j > r || nums[i] < nums[j]) { 73 | while(t <= r && nums[t] =lower){ 102 | count++; 103 | } 104 | var sum=nums[i]; 105 | for(var j=i+1;j=lower){ 108 | count++; 109 | } 110 | } 111 | } 112 | return count; 113 | }; 114 | 115 | ``` 116 | 117 | #### c#答案 118 | 119 | ```c# 120 | 121 | -------------------------------------------------------------------------------- /problem/328.奇偶链表.md: -------------------------------------------------------------------------------- 1 | ### 328.奇偶链表 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。


请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。


示例 1:


输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL

示例 2:


输入: 2->1->3->5->6->4->7->NULL 
输出: 2->3->6->7->1->5->4->NULL

说明:



  • 应当保持奇数节点和偶数节点的相对顺序。

  • 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/329.矩阵中的最长递增路径.md: -------------------------------------------------------------------------------- 1 | ### 329.矩阵中的最长递增路径 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数矩阵,找出最长递增路径的长度。


对于每个单元格,你可以往上,下,左,右四个方向移动。 你不能在对角线方向上移动或移动到边界外(即不允许环绕)。


示例 1:


输入: nums = 
[
[9,9,4],
[6,6,8],
[2,1,1]
]
输出: 4
解释: 最长递增路径为 [1, 2, 6, 9]

示例 2:


输入: nums = 
[
[3,4,5],
[3,2,6],
[2,2,1]
]
输出: 4
解释: 最长递增路径是 [3, 4, 5, 6]。注意不允许在对角线方向上移动。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/330.按要求补齐数组.md: -------------------------------------------------------------------------------- 1 | ### 330.按要求补齐数组 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。


示例 1:


输入: nums = [1,3], n = 6
输出: 1
解释:
根据 nums 里现有的组合 [1], [3], [1,3],可以得出 1, 3, 4
现在如果我们将 2 添加到 nums 中, 组合变为: [1], [2], [3], [1,3], [2,3], [1,2,3]
其和可以表示数字 1, 2, 3, 4, 5, 6,能够覆盖 [1, 6] 区间里所有的数。
所以我们最少需要添加一个数字。

示例 2:


输入: nums = [1,5,10], n = 20
输出: 2
解释: 我们需要添加 [2, 4]

示例 3:


输入: nums = [1,2,2], n = 5
输出: 0

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/332.重新安排行程.md: -------------------------------------------------------------------------------- 1 | ### 332.重新安排行程 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 出发。


说明:



  1. 如果存在多种有效的行程,你可以按字符自然排序返回最小的行程组合。例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前

  2. 所有的机场都用三个大写字母表示(机场代码)。

  3. 假定所有机票至少存在一种合理的行程。


示例 1:


输入: [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
输出: ["JFK", "MUC", "LHR", "SFO", "SJC"]

示例 2:


输入: [["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
输出: ["JFK","ATL","JFK","SFO","ATL","SFO"]
解释: 另一种有效的行程是 ["JFK","SFO","ATL","JFK","ATL","SFO"]。但是它自然排序更大更靠后。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/334.递增的三元子序列.md: -------------------------------------------------------------------------------- 1 | ### 334.递增的三元子序列 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。


数学表达式如下:


如果存在这样的 i, j, k,  且满足 0 ≤ i < j < kn-1,

使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。


示例 1:


输入: [1,2,3,4,5]
输出: true

示例 2:


输入: [5,4,3,2,1]
输出: false

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/335.路径交叉.md: -------------------------------------------------------------------------------- 1 | ### 335.路径交叉 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个含有 n 个正数的数组 x。从点 (0,0) 开始,先向北移动 x[0] 米,然后向西移动 x[1] 米,向南移动 x[2] 米,向东移动 x[3] 米,持续移动。也就是说,每次移动后你的方位会发生逆时针变化。


编写一个 O(1) 空间复杂度的一趟扫描算法,判断你所经过的路径是否相交。


示例 1:


输入: [2,1,1,2]

?????
? ?
???????>
?
输出: true
解释: 路径交叉了

示例 2:


输入: [1,2,3,4]

????????
? ?
?
?
?????????????>
输出: false
解释: 路径没有相交

示例 3:


输入: [1,1,1,1]

?????
? ?
?????>
输出: true
解释: 路径相交了

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/336.回文对.md: -------------------------------------------------------------------------------- 1 | ### 336.回文对 2 | 3 | #### 1.题目描述 4 | 5 |

给定一组唯一的单词, 找出所有不同 的索引对(i, j),使得列表中的两个单词, words[i] + words[j] ,可拼接成回文串。


示例 1:


输入: ["abcd","dcba","lls","s","sssll"]
输出: [[0,1],[1,0],[3,2],[2,4]]
解释: 可拼接成的回文串为 ["dcbaabcd","abcddcba","slls","llssssll"]

示例 2:


输入: ["bat","tab","cat"]
输出: [[0,1],[1,0]]
解释: 可拼接成的回文串为 ["battab","tabbat"]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/341.扁平化嵌套列表迭代器.md: -------------------------------------------------------------------------------- 1 | ### 341.扁平化嵌套列表迭代器 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个嵌套的整型列表。设计一个迭代器,使其能够遍历这个整型列表中的所有整数。


列表中的项或者为一个整数,或者是另一个列表。


示例 1:


输入: [[1,1],2,[1,1]]
输出: [1,1,2,1,1]
解释: 通过重复调用 next 直到 hasNext 返回false,next 返回的元素的顺序应该是: [1,1,2,1,1]

示例 2:


输入: [1,[4,[6]]]
输出: [1,4,6]
解释: 通过重复调用 next 直到 hasNext 返回false,next 返回的元素的顺序应该是: [1,4,6]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/342.4的幂.md: -------------------------------------------------------------------------------- 1 | ### 342.4的幂 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。


示例 1:


输入: 16
输出: true

示例 2:


输入: 5
输出: false

进阶:

你能不使用循环或者递归来完成本题吗?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/343.整数拆分.md: -------------------------------------------------------------------------------- 1 | ### 343.整数拆分 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。


示例 1:


输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:


输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

说明: 你可以假设 不小于 2 且不大于 58。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/344.反转字符串.md: -------------------------------------------------------------------------------- 1 | ### 344.反转字符串 2 | 3 | #### 1.题目描述 4 | 5 |

编写一个函数,其作用是将输入的字符串反转过来。


示例 1:


输入: "hello"
输出: "olleh"

示例 2:


输入: "A man, a plan, a canal: Panama"
输出: "amanaP :lanac a ,nalp a ,nam A"

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | char* reverseString(char* s) { 12 | int n=strlen(s); 13 | int i; 14 | char temp; 15 | for(i=0;i= 0; i--) 105 | { 106 | SB.Append(s[i]); 107 | } 108 | return SB.ToString(); 109 | } 110 | } 111 | 112 | ``` 113 | 114 | #### python2.x答案 115 | 116 | ```python 117 | 118 | class Solution(object): 119 | def reverseString(self, s): 120 | """ 121 | :type s: str 122 | :rtype: str 123 | """ 124 | i = 0 125 | str_list = list(s) 126 | j = len(str_list) - 1 127 | #print(str_list) 128 | 129 | while i < j: 130 | tmp = str_list[j] 131 | str_list[j] = str_list[i] 132 | str_list[i] = tmp 133 | i += 1 134 | j -= 1 135 | 136 | return "".join(str_list) 137 | 138 | 139 | 140 | ``` 141 | 142 | #### python3.x答案 143 | 144 | ```python 145 | 146 | class Solution: 147 | def reverseString(self, s): 148 | """ 149 | :type s: str 150 | :rtype: str 151 | """ 152 | s = s[::-1] 153 | return s 154 | 155 | ``` 156 | 157 | #### go答案 158 | 159 | ```go 160 | 161 | func reverseString(s string) string { 162 | if s == ""{ 163 | return s 164 | } 165 | lst := []string{} 166 | for i := len(s)-1; i > -1; i--{ 167 | lst = append(lst,string(s[i])) 168 | } 169 | s1 := strings.Join(lst, "") 170 | return s1 171 | } 172 | 173 | ``` -------------------------------------------------------------------------------- /problem/354.俄罗斯套娃信封问题.md: -------------------------------------------------------------------------------- 1 | ### 354.俄罗斯套娃信封问题 2 | 3 | #### 1.题目描述 4 | 5 |

给定一些标记了宽度和高度的信封,宽度和高度以整数对形式 (w, h) 出现。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。


请计算最多能有多少个信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。


说明:

不允许旋转信封。


示例:


输入: envelopes = [[5,4],[6,4],[6,7],[2,3]]
输出: 3
解释: 最多信封的个数为 3, 组合为: [2,3] => [5,4] => [6,7]。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/355.设计推特.md: -------------------------------------------------------------------------------- 1 | ### 355.设计推特 2 | 3 | #### 1.题目描述 4 | 5 |

设计一个简化版的推特(Twitter),可以让用户实现发送推文,关注/取消关注其他用户,能够看见关注人(包括自己)的最近十条推文。你的设计需要支持以下的几个功能:



  1. postTweet(userId, tweetId): 创建一条新的推文

  2. getNewsFeed(userId): 检索最近的十条推文。每个推文都必须是由此用户关注的人或者是用户自己发出的。推文必须按照时间顺序由最近的开始排序。

  3. follow(followerId, followeeId): 关注一个用户

  4. unfollow(followerId, followeeId): 取消关注一个用户


示例:



Twitter twitter = new Twitter();
// 用户1发送了一条新推文 (用户id = 1, 推文id = 5).
twitter.postTweet(1, 5);
// 用户1的获取推文应当返回一个列表,其中包含一个id为5的推文.
twitter.getNewsFeed(1);
// 用户1关注了用户2.
twitter.follow(1, 2);
// 用户2发送了一个新推文 (推文id = 6).
twitter.postTweet(2, 6);
// 用户1的获取推文应当返回一个列表,其中包含两个推文,id分别为 -> [6, 5].
// 推文id6应当在推文id5之前,因为它是在5之后发送的.
twitter.getNewsFeed(1);
// 用户1取消关注了用户2.
twitter.unfollow(1, 2);
// 用户1的获取推文应当返回一个列表,其中包含一个id为5的推文.
// 因为用户1已经不再关注用户2.
twitter.getNewsFeed(1);

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/357.计算各个位数不同的数字个数.md: -------------------------------------------------------------------------------- 1 | ### 357.计算各个位数不同的数字个数 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个非负整数 n,计算各位数字都不同的数字 x 的个数,其中 0 ≤ x < 10


示例:


输入: 2
输出: 91
解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外,在 [0,100) 区间内的所有数字。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/363.矩形区域不超过 K 的最大数值和.md: -------------------------------------------------------------------------------- 1 | ### 363.矩形区域不超过 K 的最大数值和 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。


示例:


输入: matrix = [[1,0,1],[0,-2,3]], k = 2
输出: 2
解释: 矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。

说明:



  1. 矩阵内的矩形区域面积必须大于 0。

  2. 如果行数远大于列数,你将如何解答呢?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/371.两整数之和.md: -------------------------------------------------------------------------------- 1 | ### 371.两整数之和 2 | 3 | #### 1.题目描述 4 | 5 |

不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。


示例 1:


输入: a = 1, b = 2
输出: 3

示例 2:


输入: a = -2, b = 3
输出: 1

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/373.查找和最小的K对数字.md: -------------------------------------------------------------------------------- 1 | ### 373.查找和最小的K对数字 2 | 3 | #### 1.题目描述 4 | 5 |

给定两个以升序排列的整形数组 nums1nums2, 以及一个整数 k


定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2


找到和最小的 k 对数字 (u1,v1), (u2,v2) ... (uk,vk)


示例 1:


输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3
输出: [1,2],[1,4],[1,6]
解释: 返回序列中的前 3 对数:
[1,2],[1,4],[1,6],[7,2],[7,4],[11,2],[7,6],[11,4],[11,6]

示例 2:


输入: nums1 = [1,1,2], nums2 = [1,2,3], k = 2
输出: [1,1],[1,1]
解释: 返回序列中的前 2 对数:
  [1,1],[1,1],[1,2],[2,1],[1,2],[2,2],[1,3],[1,3],[2,3]

示例 3:


输入: nums1 = [1,2], nums2 = [3], k = 3 
输出: [1,3],[2,3]
解释: 也可能序列中所有的数对都被返回:[1,3],[2,3]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/374.猜数字大小.md: -------------------------------------------------------------------------------- 1 | ### 374.猜数字大小 2 | 3 | #### 1.题目描述 4 | 5 |

我们正在玩一个猜数字游戏。 游戏规则如下:

我从 1 到 n 选择一个数字。 你需要猜我选择了哪个数字。

每次你猜错了,我会告诉你这个数字是大了还是小了。

你调用一个预先定义好的接口 guess(int num),它会返回 3 个可能的结果(-11 或 0):


-1 : 我的数字比较小
1 : 我的数字比较大
0 : 恭喜!你猜对了!

示例 :


输入: n = 10, pick = 6
输出: 6

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/375.猜数字大小 II.md: -------------------------------------------------------------------------------- 1 | ### 375.猜数字大小 II 2 | 3 | #### 1.题目描述 4 | 5 |

我们正在玩一个猜数游戏,游戏规则如下:


我从 n 之间选择一个数字,你来猜我选了哪个数字。


每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了。


然而,当你猜了数字 x 并且猜错了的时候,你需要支付金额为 x 的现金。直到你猜到我选的数字,你才算赢得了这个游戏。


示例:



n = 10, 我选择了8.
第一轮: 你猜我选择的数字是5,我会告诉你,我的数字更大一些,然后你需要支付5块。
第二轮: 你猜是7,我告诉你,我的数字更大一些,你支付7块。
第三轮: 你猜是9,我告诉你,我的数字更小一些,你支付9块。
游戏结束。8 就是我选的数字。
你最终要支付 5 + 7 + 9 = 21 块钱。

给定一个 n ≥ 1,计算你至少需要拥有多少现金才能确保你能赢得这个游戏。


致谢:


特别感谢 @agave 和 @StefanPochmann 添加了这道题目,并且提供了所有测试用例。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/382.链表随机节点.md: -------------------------------------------------------------------------------- 1 | ### 382.链表随机节点 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样


进阶:

如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现?


示例:



// 初始化一个单链表 [1,2,3].
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
Solution solution = new Solution(head);
// getRandom()方法应随机返回1,2,3中的一个,保证每个元素被返回的概率相等。
solution.getRandom();

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/383.赎金信.md: -------------------------------------------------------------------------------- 1 | ### 383.赎金信 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回 true ;否则返回 false。


(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。)


注意:


你可以假设两个字符串均只含有小写字母。



canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/384.打乱数组.md: -------------------------------------------------------------------------------- 1 | ### 384.打乱数组 2 | 3 | #### 1.题目描述 4 | 5 |

打乱一个没有重复元素的数组。


示例:



// 以数字集合 1, 2 和 3 初始化数组。
int[] nums = {1,2,3};
Solution solution = new Solution(nums);
// 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。
solution.shuffle();
// 重设数组到它的初始状态[1,2,3]。
solution.reset();
// 随机返回数组[1,2,3]打乱后的结果。
solution.shuffle();

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/385.迷你语法分析器.md: -------------------------------------------------------------------------------- 1 | ### 385.迷你语法分析器 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个用字符串表示的整数的嵌套列表,实现一个解析它的语法分析器。


列表中的每个元素只可能是整数或整数嵌套列表


提示:你可以假定这些字符串都是格式良好的:



  • 字符串非空

  • 字符串不包含空格

  • 字符串只包含数字0-9, [, - ,, ]


 


示例 1:



给定 s = "324",
你应该返回一个 NestedInteger 对象,其中只包含整数值 324。

 


示例 2:



给定 s = "[123,[456,[789]]]",
返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表:
1. 一个 integer 包含值 123
2. 一个包含两个元素的嵌套列表:
i. 一个 integer 包含值 456
ii. 一个包含一个元素的嵌套列表
a. 一个 integer 包含值 789

 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/386.字典序排数.md: -------------------------------------------------------------------------------- 1 | ### 386.字典序排数 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数 n, 返回从 到 的字典顺序。


例如,


给定 n =1 3,返回 [1,10,11,12,13,2,3,4,5,6,7,8,9] 。


请尽可能的优化算法的时间复杂度和空间复杂度。 输入的数据 小于等于 5,000,000。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/387.字符串中的第一个唯一字符.md: -------------------------------------------------------------------------------- 1 | ### 387.字符串中的第一个唯一字符 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。


案例:



s = "leetcode"
返回 0.
s = "loveleetcode",
返回 2.

 


注意事项:您可以假定该字符串只包含小写字母。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/388.文件的最长绝对路径.md: -------------------------------------------------------------------------------- 1 | ### 388.文件的最长绝对路径 2 | 3 | #### 1.题目描述 4 | 5 |

假设我们以下述方式将我们的文件系统抽象成一个字符串:


字符串 "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext" 表示:



dir
subdir1
subdir2
file.ext

目录 dir 包含一个空的子目录 subdir1 和一个包含一个文件 file.ext 的子目录 subdir2


字符串 "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext" 表示:



dir
subdir1
file1.ext
subsubdir1
subdir2
subsubdir2
file2.ext

目录 dir 包含两个子目录 subdir1 和 subdir2。 subdir1 包含一个文件 file1.ext 和一个空的二级子目录 subsubdir1subdir2 包含一个二级子目录 subsubdir2 ,其中包含一个文件 file2.ext


我们致力于寻找我们文件系统中文件的最长 (按字符的数量统计) 绝对路径。例如,在上述的第二个例子中,最长路径为 "dir/subdir2/subsubdir2/file2.ext",其长度为 32 (不包含双引号)。


给定一个以上述格式表示文件系统的字符串,返回文件系统中文件的最长绝对路径的长度。 如果系统中没有文件,返回 0


说明:



  • 文件名至少存在一个 . 和一个扩展名。

  • 目录或者子目录的名字不能包含 .


要求时间复杂度为 O(n) ,其中 n 是输入字符串的大小。


请注意,如果存在路径 aaaaaaaaaaaaaaaaaaaaa/sth.png 的话,那么  a/aa/aaa/file1.txt 就不是一个最长的路径。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/389.找不同.md: -------------------------------------------------------------------------------- 1 | ### 389.找不同 2 | 3 | #### 1.题目描述 4 | 5 |

给定两个字符串 st,它们只包含小写字母。


字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。


请找出在 t 中被添加的字母。


 


示例:


输入:
s = "abcd"
t = "abcde"
输出:
e
解释:
'e' 是那个被添加的字母。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/391.完美矩形.md: -------------------------------------------------------------------------------- 1 | ### 391.完美矩形 2 | 3 | #### 1.题目描述 4 | 5 |

我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域。



每个矩形用左下角的点和右上角的点的坐标来表示。例如, 一个单位正方形可以表示为 [1,1,2,2]。 ( 左下角的点的坐标为 (1, 1) 以及右上角的点的坐标为 (2, 2) )。





示例 1:


rectangles = [
[1,1,3,3],
[3,1,4,2],
[3,2,4,4],
[1,3,2,4],
[2,3,3,4]
]

返回 true。5个矩形一起可以精确地覆盖一个矩形区域。







示例 2:


rectangles = [
[1,1,2,3],
[1,3,2,4],
[3,1,4,2],
[3,2,4,4]
]

返回 false。两个矩形之间有间隔,无法覆盖成一个矩形。







示例 3:


rectangles = [
[1,1,3,3],
[3,1,4,2],
[1,3,2,4],
[3,2,4,4]
]

返回 false。图形顶端留有间隔,无法覆盖成一个矩形。







示例 4:


rectangles = [
[1,1,3,3],
[3,1,4,2],
[1,3,2,4],
[2,2,4,4]
]

返回 false。因为中间有相交区域,虽然形成了矩形,但不是精确覆盖。



6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/392.判断子序列.md: -------------------------------------------------------------------------------- 1 | ### 392.判断子序列 2 | 3 | #### 1.题目描述 4 | 5 |

给定字符串 st ,判断 s 是否为 t 的子序列。


你可以认为 st 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。


字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace""abcde"的一个子序列,而"aec"不是)。


示例 1:

s = "abc", t = "ahbgdc"


返回 true.


示例 2:

s = "axc", t = "ahbgdc"


返回 false.


后续挑战 :


如果有大量输入的 S,称作S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?


致谢:


特别感谢 @pbrother 添加此问题并且创建所有测试用例。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/398.随机数索引.md: -------------------------------------------------------------------------------- 1 | ### 398.随机数索引 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。


注意:

数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。


示例:



int[] nums = new int[] {1,2,3,3,3};
Solution solution = new Solution(nums);
// pick(3) 应该返回索引 2,3 或者 4。每个索引的返回概率应该相等。
solution.pick(3);
// pick(1) 应该返回 0。因为只有nums[0]等于1。
solution.pick(1);

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | typedef struct { 12 | int *nums; 13 | int numsSize; 14 | int *indexs; 15 | } Solution; 16 | 17 | uint32_t rand_seed = 1; 18 | 19 | int rand(){ 20 | rand_seed = rand_seed * 2303515245 + 45678 ; 21 | return (uint32_t)(rand_seed/65535) % 32768; 22 | 23 | } 24 | 25 | Solution* solutionCreate(int* nums, int numsSize) { 26 | Solution *s = (Solution *)malloc(sizeof(Solution)); 27 | s->nums = nums; 28 | s->numsSize = numsSize; 29 | s->indexs = (int *)malloc(sizeof(int) * numsSize); 30 | 31 | return s; 32 | } 33 | 34 | int solutionPick(Solution* obj, int target) { 35 | int i; 36 | int index = 0; 37 | int j; 38 | 39 | for(i=0; inumsSize; i++){ 40 | if(obj->nums[i] == target){ 41 | obj->indexs[index++] = i; 42 | } 43 | } 44 | 45 | j = rand() % index; 46 | 47 | return obj->indexs[j]; 48 | 49 | } 50 | 51 | void solutionFree(Solution* obj) { 52 | free(obj->indexs); 53 | free(obj); 54 | } 55 | 56 | /** 57 | * Your Solution struct will be instantiated and called as such: 58 | * struct Solution* obj = solutionCreate(nums, numsSize); 59 | * int param_1 = solutionPick(obj, target); 60 | * solutionFree(obj); 61 | */ 62 | 63 | ``` 64 | 65 | #### c++答案 66 | 67 | ```c++ 68 | 69 | //或者O(n)的时间复杂度pick,长度为1的蓄水池。 70 | class Solution { 71 | public: 72 | vector nums; 73 | Solution(vector nums) { 74 | this->nums = nums; 75 | } 76 | 77 | int pick(int target) { 78 | int count = 0; 79 | int result = 0; 80 | for(int i = 0;i < nums.size();i++) { 81 | if(nums[i] == target) { 82 | if((random() % (count + 1)) == count) { 83 | result = i; 84 | } 85 | count++; 86 | } 87 | } 88 | return result; 89 | } 90 | }; 91 | 92 | /** 93 | * Your Solution object will be instantiated and called as such: 94 | * Solution obj = new Solution(nums); 95 | * int param_1 = obj.pick(target); 96 | */ 97 | 98 | ``` 99 | 100 | #### java答案 101 | 102 | ```java 103 | 104 | class Solution { 105 | 106 | private int[] nums; 107 | 108 | public Solution(int[] nums) { 109 | this.nums = nums; 110 | } 111 | 112 | public int pick(int target) { 113 | // 统计总数 114 | List indexList = new ArrayList<>(); 115 | for(int i=0; i给出方程式 A / B = k, 其中 A 和 B 均为代表字符串的变量, k 是一个浮点型数字。根据已知方程式求解问题,并返回计算结果。如果结果不存在,则返回 -1.0


示例 :

给定 a / b = 2.0, b / c = 3.0

问题: a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ? 

返回 [6.0, 0.5, -1.0, 1.0, -1.0 ]


输入为: vector<pair<string, string>> equations, vector<double>& values, vector<pair<string, string>> queries(方程式,方程式结果,问题方程式), 其中 equations.size() == values.size(),即方程式的长度与方程式结果长度相等(程式与结果一一对应),并且结果值均为正数。以上为方程式的描述。 返回vector<double>类型。


基于上述例子,输入如下:



equations(方程式) = [ ["a", "b"], ["b", "c"] ],
values(方程式结果) = [2.0, 3.0],
queries(问题方程式) = [ ["a", "c"], ["b", "a"], ["a", "e"], ["a", "a"], ["x", "x"] ].

输入总是有效的。你可以假设除法运算中不会出现除数为0的情况,且不存在任何矛盾的结果。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/400.第N个数字.md: -------------------------------------------------------------------------------- 1 | ### 400.第N个数字 2 | 3 | #### 1.题目描述 4 | 5 |

在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 个数字。


注意:

是正数且在32为整形范围内 ( n < 231)。


示例 1:



输入:
3
输出:
3

示例 2:



输入:
11
输出:
0
说明:
第11个数字在序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ... 里是0,它是10的一部分。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/401.二进制手表.md: -------------------------------------------------------------------------------- 1 | ### 401.二进制手表 2 | 3 | #### 1.题目描述 4 | 5 |

二进制手表顶部有 4 个 LED 代表小时(0-11),底部的 6 个 LED 代表分钟(0-59)


每个 LED 代表一个 0 或 1,最低位在右侧。



例如,上面的二进制手表读取 “3:25”。


给定一个非负整数 代表当前 LED 亮着的数量,返回所有可能的时间。


案例:



输入: n = 1
返回: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]

 


注意事项:



  • 输出的顺序没有要求。

  • 小时不会以零开头,比如 “01:00” 是不允许的,应为 “1:00”。

  • 分钟必须由两位数组成,可能会以零开头,比如 “10:2” 是无效的,应为 “10:02”。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/402.移掉K位数字.md: -------------------------------------------------------------------------------- 1 | ### 402.移掉K位数字 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。


注意:



  • num 的长度小于 10002 且 ≥ k。

  • num 不会包含任何前导零。


示例 1 :



输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。

示例 2 :



输入: num = "10200", k = 1
输出: "200"
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。

示例 3 :



输入: num = "10", k = 2
输出: "0"
解释: 从原数字移除所有的数字,剩余为空就是0。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/407.接雨水 II.md: -------------------------------------------------------------------------------- 1 | ### 407.接雨水 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个m x n的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。



说明:



都是小于110的整数。每一个单位的高度都大于0 且小于 20000。



示例:




给出如下 3x6 的高度图:
[
[1,4,3,1,3,2],
[3,2,1,3,2,4],
[2,3,3,2,3,1]
]

返回 4。






如上图所示,这是下雨前的高度图[[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]] 的状态。






下雨后,雨水将会被存储在这些方块中。总的接雨水量是4。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/409.最长回文串.md: -------------------------------------------------------------------------------- 1 | ### 409.最长回文串 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。


在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。


注意:

假设字符串的长度不会超过 1010。


示例 1:



输入:
"abccccdd"
输出:
7
解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/413.等差数列划分.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yooubei/leetcode_answer/50f4ae178de4d32dd7bde5405f7374bf25c859c2/problem/413.等差数列划分.md -------------------------------------------------------------------------------- /problem/417.太平洋大西洋水流问题.md: -------------------------------------------------------------------------------- 1 | ### 417.太平洋大西洋水流问题 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。


规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。


请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。


 


提示:



  1. 输出坐标的顺序不重要

  2. mn 都小于150


 


示例:


 



给定下面的 5x5 矩阵:
太平洋 ~ ~ ~ ~ ~
~ 1 2 2 3 (5) *
~ 3 2 3 (4) (4) *
~ 2 4 (5) 3 1 *
~ (6) (7) 1 4 5 *
~ (5) 1 1 2 4 *
* * * * * 大西洋
返回:
[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上图中带括号的单元).

 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/420.强密码检验器.md: -------------------------------------------------------------------------------- 1 | ### 420.强密码检验器 2 | 3 | #### 1.题目描述 4 | 5 |

一个强密码应满足以下所有条件:



  1. 由至少6个,至多20个字符组成。

  2. 至少包含一个小写字母,一个大写字母,和一个数字。

  3. 同一字符不能连续出现三次 (比如 "...aaa..." 是不允许的, 但是 "...aa...a..." 是可以的)。


编写函数 strongPasswordChecker(s),s 代表输入字符串,如果 s 已经符合强密码条件,则返回0;否则返回要将 s 修改为满足强密码条件的字符串所需要进行修改的最小步数。


插入、删除、替换任一字符都算作一次修改。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/421.数组中两个数的最大异或值.md: -------------------------------------------------------------------------------- 1 | ### 421.数组中两个数的最大异或值 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个非空数组,数组中元素为 a0, a1, a2, … , an-1,其中 0 ≤ ai < 231 


找到 ai 和a最大的异或 (XOR) 运算结果,其中0 ≤ i,  j <


你能在O(n)的时间解决这个问题吗?


示例:



输入: [3, 10, 5, 25, 2, 8]
输出: 28
解释: 最大的结果是 5 ^ 25 = 28.

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/427.建立四叉树.md: -------------------------------------------------------------------------------- 1 | ### 427.建立四叉树 2 | 3 | #### 1.题目描述 4 | 5 |

我们想要使用一棵四叉树来储存一个 N x N 的布尔值网络。网络中每一格的值只会是真或假。树的根结点代表整个网络。对于每个结点, 它将被分等成四个孩子结点直到这个区域内的值都是相同的.


每个结点还有另外两个布尔变量: isLeaf 和 valisLeaf 当这个节点是一个叶子结点时为真。val 变量储存叶子结点所代表的区域的值。


你的任务是使用一个四叉树表示给定的网络。下面的例子将有助于你理解这个问题:


给定下面这个8 x 8 网络,我们将这样建立一个对应的四叉树:



由上文的定义,它能被这样分割:



 


对应的四叉树应该像下面这样,每个结点由一对 (isLeaf, val) 所代表.


对于非叶子结点,val 可以是任意的,所以使用 * 代替。



提示:



  1. N 将小于 1000 且确保是 2 的整次幂。

  2. 如果你想了解更多关于四叉树的知识,你可以参考这个 wiki 页面。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/429.N叉树的层序遍历.md: -------------------------------------------------------------------------------- 1 | ### 429.N叉树的层序遍历 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个N叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。


 


例如,给定一个 3叉树 :


 



 


返回其层序遍历:


[
[1],
[3,2,4],
[5,6]
]

 


说明:



  1. 树的深度不会超过 1000

  2. 树的节点总数不会超过 5000


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/430.扁平化多级双向链表.md: -------------------------------------------------------------------------------- 1 | ### 430.扁平化多级双向链表 2 | 3 | #### 1.题目描述 4 | 5 |

您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表。这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。


扁平化列表,使所有结点出现在单级双链表中。您将获得列表第一级的头部。


示例:



输入:
1---2---3---4---5---6--NULL
|
7---8---9---10--NULL
|
11--12--NULL
输出:
1-2-3-7-8-11-12-9-10-4-5-6-NULL

以上示例的说明:


给出以下多级双向链表:



我们应该返回如下所示的扁平双向链表:



6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/432.全 O(1) 的数据结构.md: -------------------------------------------------------------------------------- 1 | ### 432.全 O(1) 的数据结构 2 | 3 | #### 1.题目描述 4 | 5 |

实现一个数据结构支持以下操作:



  1. Inc(key) - 插入一个新的值为 1 的 key。或者使一个存在的 key 增加一,保证 key 不为空字符串。

  2. Dec(key) - 如果这个 key 的值是 1,那么把他从数据结构中移除掉。否者使一个存在的 key 值减一。如果这个 key 不存在,这个函数不做任何事情。key 保证不为空字符串。

  3. GetMaxKey() - 返回 key 中值最大的任意一个。如果没有元素存在,返回一个空字符串""

  4. GetMinKey() - 返回 key 中值最小的任意一个。如果没有元素存在,返回一个空字符串""


挑战:以 O(1) 的时间复杂度实现所有操作。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/433.最小基因变化.md: -------------------------------------------------------------------------------- 1 | ### 433.最小基因变化 2 | 3 | #### 1.题目描述 4 | 5 |

一条基因序列由一个带有8个字符的字符串表示,其中每个字符都属于 "A", "C", "G", "T"中的任意一个。


假设我们要调查一个基因序列的变化。一次基因变化意味着这个基因序列中的一个字符发生了变化。


例如,基因序列由"AACCGGTT" 变化至 "AACCGGTA" 即发生了一次基因变化。


与此同时,每一次基因变化的结果,都需要是一个合法的基因串,即该结果属于一个基因库。


现在给定3个参数 — start, end, bank,分别代表起始基因序列,目标基因序列及基因库,请找出能够使起始基因序列变化为目标基因序列所需的最少变化次数。如果无法实现目标变化,请返回 -1。


注意:



  1. 起始基因序列默认是合法的,但是它并不一定会出现在基因库中。

  2. 所有的目标基因序列必须是合法的。

  3. 假定起始基因序列与目标基因序列是不一样的。


示例 1:



start: "AACCGGTT"
end: "AACCGGTA"
bank: ["AACCGGTA"]
返回值: 1

示例 2:



start: "AACCGGTT"
end: "AAACGGTA"
bank: ["AACCGGTA", "AACCGCTA", "AAACGGTA"]
返回值: 2

示例 3:



start: "AAAAACCC"
end: "AACCCCCC"
bank: ["AAAACCCC", "AAACCCCC", "AACCCCCC"]
返回值: 3

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/434.字符串中的单词数.md: -------------------------------------------------------------------------------- 1 | ### 434.字符串中的单词数 2 | 3 | #### 1.题目描述 4 | 5 |

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。


请注意,你可以假定字符串里不包括任何不可打印的字符。


示例:


输入: "Hello, my name is John"
输出: 5

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/437.路径总和 III.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yooubei/leetcode_answer/50f4ae178de4d32dd7bde5405f7374bf25c859c2/problem/437.路径总和 III.md -------------------------------------------------------------------------------- /problem/440.字典序的第K小数字.md: -------------------------------------------------------------------------------- 1 | ### 440.字典序的第K小数字 2 | 3 | #### 1.题目描述 4 | 5 |

给定整数 n 和 k,找到 1 到 n 中字典序第 k 小的数字。


注意:1 ≤ k ≤ n ≤ 109


示例 :



输入:
n: 13 k: 2
输出:
10
解释:
字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/441.排列硬币.md: -------------------------------------------------------------------------------- 1 | ### 441.排列硬币 2 | 3 | #### 1.题目描述 4 | 5 |

你总共有 枚硬币,你需要将它们摆成一个阶梯形状,第 行就必须正好有 枚硬币。


给定一个数字 n,找出可形成完整阶梯行的总行数。


是一个非负整数,并且在32位有符号整型的范围内。


示例 1:



n = 5
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤
因为第三行不完整,所以返回2.

示例 2:



n = 8
硬币可排列成以下几行:
¤
¤ ¤
¤ ¤ ¤
¤ ¤
因为第四行不完整,所以返回3.

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/442.数组中重复的数据.md: -------------------------------------------------------------------------------- 1 | ### 442.数组中重复的数据 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数数组 a,其中1 ≤ a[i] ≤ nn为数组长度), 其中有些元素出现两次而其他元素出现一次


找到所有出现两次的元素。


你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?


示例:



输入:
[4,3,2,7,8,2,3,1]
输出:
[2,3]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/443.压缩字符串.md: -------------------------------------------------------------------------------- 1 | ### 443.压缩字符串 2 | 3 | #### 1.题目描述 4 | 5 |

给定一组字符,使用原地算法将其压缩。


压缩后的长度必须始终小于或等于原数组长度。


数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。


在完成原地修改输入数组后,返回数组的新长度。


 


进阶:

你能否仅使用O(1) 空间解决问题?


 


示例 1:



输入:
["a","a","b","b","c","c","c"]
输出:
返回6,输入数组的前6个字符应该是:["a","2","b","2","c","3"]
说明:
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。

示例 2:



输入:
["a"]
输出:
返回1,输入数组的前1个字符应该是:["a"]
说明:
没有任何字符串被替代。

示例 3:



输入:
["a","b","b","b","b","b","b","b","b","b","b","b","b"]
输出:
返回4,输入数组的前4个字符应该是:["a","b","1","2"]。
说明:
由于字符"a"不重复,所以不会被压缩。"bbbbbbbbbbbb"被“b12”替代。
注意每个数字在数组中都有它自己的位置。

注意:



  1. 所有字符都有一个ASCII值在[35, 126]区间内。

  2. 1 <= len(chars) <= 1000


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/445.两数相加 II.md: -------------------------------------------------------------------------------- 1 | ### 445.两数相加 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定两个非空链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储单个数字。将这两数相加会返回一个新的链表。


 


你可以假设除了数字 0 之外,这两个数字都不会以零开头。


进阶:


如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。


示例:



输入: (7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)
输出: 7 -> 8 -> 0 -> 7

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/446.等差数列划分 II - 子序列.md: -------------------------------------------------------------------------------- 1 | ### 446.等差数列划分 II - 子序列 2 | 3 | #### 1.题目描述 4 | 5 |

如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列。


例如,以下数列为等差数列:


1, 3, 5, 7, 9
7, 7, 7, 7
3, -1, -5, -9

以下数列不是等差数列。


1, 1, 2, 5, 7

 


数组 A 包含 N 个数,且索引从 0 开始。该数组子序列将划分为整数序列 (P0, P1, ..., Pk),P 与 Q 是整数且满足 0 ≤ P0 < P1 < ... < Pk < N。


 


如果序列 A[P0],A[P1],...,A[Pk-1],A[Pk] 是等差的,那么数组 A 的子序列 (P0,P1,…,PK) 称为等差序列。值得注意的是,这意味着 k ≥ 2。


函数要返回数组 A 中所有等差子序列的个数。


输入包含 N 个整数。每个整数都在 -231 和 231-1 之间,另外 0 ≤ N ≤ 1000。保证输出小于 231-1。


 


示例:


 


输入:[2, 4, 6, 8, 10]
输出:7
解释:
所有的等差子序列为:
[2,4,6]
[4,6,8]
[6,8,10]
[2,4,6,8]
[4,6,8,10]
[2,4,6,8,10]
[2,6,10]

 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/447.回旋镖的数量.md: -------------------------------------------------------------------------------- 1 | ### 447.回旋镖的数量 2 | 3 | #### 1.题目描述 4 | 5 |

给定平面上 n 对不同的点,“回旋镖” 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。


找到所有回旋镖的数量。你可以假设 n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。


示例:



输入:
[[0,0],[1,0],[2,0]]
输出:
2
解释:
两个回旋镖为 [[1,0],[0,0],[2,0]][[1,0],[2,0],[0,0]]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/448.找到所有数组中消失的数字.md: -------------------------------------------------------------------------------- 1 | ### 448.找到所有数组中消失的数字 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个范围在  1 ≤ a[i] ≤ nn = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。


找到所有在 [1, n] 范围之间没有出现在数组中的数字。


您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。


示例:



输入:
[4,3,2,7,8,2,3,1]
输出:
[5,6]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/449.序列化和反序列化二叉搜索树.md: -------------------------------------------------------------------------------- 1 | ### 449.序列化和反序列化二叉搜索树 2 | 3 | #### 1.题目描述 4 | 5 |

序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。


设计一个算法来序列化和反序列化二叉搜索树。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。


编码的字符串应尽可能紧凑。


注意:不要使用类成员/全局/静态变量来存储状态。 你的序列化和反序列化算法应该是无状态的。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/450.删除二叉搜索树中的节点.md: -------------------------------------------------------------------------------- 1 | ### 450.删除二叉搜索树中的节点 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。


一般来说,删除节点可分为两个步骤:



  1. 首先找到需要删除的节点;

  2. 如果找到了,删除它。


说明: 要求算法时间复杂度为 O(h),h 为树的高度。


示例:



root = [5,3,6,2,4,null,7]
key = 3
5
/ \
3 6
/ \ \
2 4 7
给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
5
/ \
4 6
/ \
2 7
另一个正确答案是 [5,2,6,null,4,null,7]。
5
/ \
2 6
\ \
4 7

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/453.最小移动次数使数组元素相等.md: -------------------------------------------------------------------------------- 1 | ### 453.最小移动次数使数组元素相等 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个长度为 n非空整数数组,找到让数组所有元素相等的最小移动次数。每次移动可以使 n - 1 个元素增加 1。


示例:



输入:
[1,2,3]
输出:
3
解释:
只需要3次移动(注意每次移动会增加两个元素的值):
[1,2,3] => [2,3,3] => [3,4,3] => [4,4,4]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int minMoves(int* nums, int numsSize) { 12 | int min=2147483647,sum=0; 13 | for(int i=0;i& nums) { 29 | int minn = INT_MAX,res = 0; 30 | for(auto num:nums) minn = min(minn,num); 31 | for(auto num:nums) res+=num-minn; 32 | return res; 33 | } 34 | }; 35 | 36 | ``` 37 | 38 | #### java答案 39 | 40 | ```java 41 | 42 | class Solution { 43 | public int minMoves(int[] nums) { 44 | int r=0,min=nums[0]; 45 | for(int x:nums) 46 | { 47 | if(min>x) 48 | { 49 | min=x; 50 | } 51 | } 52 | for(int x:nums) 53 | { 54 | r=r+x-min; 55 | } 56 | 57 | return r; 58 | 59 | } 60 | 61 | 62 | } 63 | 64 | ``` 65 | 66 | #### JavaScript答案 67 | 68 | ```javascript 69 | 70 | /** 71 | * @param {number[]} nums 72 | * @return {number} 73 | */ 74 | var minMoves = function(nums) { 75 | let min = Number.MAX_VALUE; 76 | let res = 0; 77 | for(let i = 0; i < nums.length; i++){ 78 | if(nums[i] < min){ 79 | min = nums[i]; 80 | } 81 | res += nums[i]; 82 | } 83 | return res-min*nums.length; 84 | }; 85 | 86 | ``` 87 | 88 | #### c#答案 89 | 90 | ```c# 91 | 92 | public class Solution { 93 | public int MinMoves(int[] nums) { 94 | int min = int.MaxValue,sum=0; 95 | for(int i=0;inums[i]) 98 | min = nums[i]; 99 | } 100 | return sum-min*(nums.Length); 101 | } 102 | } 103 | 104 | ``` 105 | 106 | #### python2.x答案 107 | 108 | ```python 109 | 110 | class Solution(object): 111 | def minMoves(self, nums): 112 | """ 113 | :type nums: List[int] 114 | :rtype: int 115 | """ 116 | nums_min=min(nums); 117 | total=0; 118 | for i in nums: 119 | total+=i-nums_min; 120 | return total; 121 | 122 | 123 | 124 | ``` 125 | 126 | #### python3.x答案 127 | 128 | ```python 129 | 130 | class Solution: 131 | def minMoves(self, nums): 132 | """ 133 | :type nums: List[int] 134 | :rtype: int 135 | """ 136 | # define minNum is the smallest number in nums 137 | # sum is the sum of nums 138 | # n is the length of nums 139 | # After m moves, we get all the numbers as x 140 | # 1. sum + m*(n-1) = x*n 141 | # 2. x = minNum + m 142 | # 143 | # m = sum - minNum * n 144 | return sum(nums) - min(nums) * len(nums) 145 | 146 | ``` 147 | 148 | #### go答案 149 | 150 | ```go 151 | 152 | func minMoves(nums []int) int { 153 | sum := 0 154 | min := int(^uint(0) >> 1) 155 | for i := 0; i < len(nums); i++ { 156 | sum += nums[i] 157 | if min > nums[i] { 158 | min = nums[i] 159 | } 160 | } 161 | return sum - min*len(nums) 162 | } 163 | 164 | ``` -------------------------------------------------------------------------------- /problem/458.可怜的小猪.md: -------------------------------------------------------------------------------- 1 | ### 458.可怜的小猪 2 | 3 | #### 1.题目描述 4 | 5 |

有1000只水桶,其中有且只有一桶装的含有毒药,其余装的都是水。它们从外观看起来都一样。如果小猪喝了毒药,它会在15分钟内死去。


问题来了,如果需要你在一小时内,弄清楚哪只水桶含有毒药,你最少需要多少只猪?


回答这个问题,并为下列的进阶问题编写一个通用算法。


进阶:


假设有 n 只水桶,猪饮水中毒后会在 m 分钟内死亡,你需要多少猪(x)就能在 p 分钟内找出“有毒”水桶?n只水桶里有且仅有一只有毒的桶。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/459.重复的子字符串.md: -------------------------------------------------------------------------------- 1 | ### 459.重复的子字符串 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。


示例 1:



输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。

示例 2:



输入: "aba"
输出: False

示例 3:



输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/460.LFU缓存.md: -------------------------------------------------------------------------------- 1 | ### 460.LFU缓存 2 | 3 | #### 1.题目描述 4 | 5 |

设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put


get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。

put(key, value) - 如果键不存在,请设置或插入值。当缓存达到其容量时,它应该在插入新项目之前,使最不经常使用的项目无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,最近最少使用的键将被去除。


进阶:

你是否可以在 O(1) 时间复杂度内执行两项操作?


示例:



LFUCache cache = new LFUCache( 2 /* capacity (缓存容量) */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 去除 key 2
cache.get(2); // 返回 -1 (未找到key 2)
cache.get(3); // 返回 3
cache.put(4, 4); // 去除 key 1
cache.get(1); // 返回 -1 (未找到 key 1)
cache.get(3); // 返回 3
cache.get(4); // 返回 4

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/461.汉明距离.md: -------------------------------------------------------------------------------- 1 | ### 461.汉明距离 2 | 3 | #### 1.题目描述 4 | 5 |

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。


给出两个整数 xy,计算它们之间的汉明距离。


注意:

0 ≤ x, y < 231.


示例:



输入: x = 1, y = 4
输出: 2
解释:
1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭头指出了对应二进制位不同的位置。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/466.统计重复个数.md: -------------------------------------------------------------------------------- 1 | ### 466.统计重复个数 2 | 3 | #### 1.题目描述 4 | 5 |

定义由 n 个连接的字符串 s 组成字符串 S,即 S = [s,n]。例如,["abc", 3]=“abcabcabc”。


另一方面,如果我们可以从 s中删除某些字符使其变为 s1,我们称字符串 s可以从字符串 s获得。例如,“abc” 可以根据我们的定义从 “abdbec” 获得,但不能从 “acbbe” 获得。


现在给出两个非空字符串 S和 S2(每个最多 100 个字符长)和两个整数 0 ≤ N≤ 10和 1 ≤ N≤ 106。现在考虑字符串 S和 S2,其中S1=[s1,n1]S2=[s2,n2]。找出可以使[S2,M]从 S1 获得的最大整数 M。


示例:


输入:
s1 ="acb",n1 = 4
s2 ="ab",n2 = 2
返回:
2

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/467.环绕字符串中唯一的子字符串.md: -------------------------------------------------------------------------------- 1 | ### 467.环绕字符串中唯一的子字符串 2 | 3 | #### 1.题目描述 4 | 5 |

把字符串 s 看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s 看起来是这样的:"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....". 


现在我们有了另一个字符串 p 。你需要的是找出 s 中有多少个唯一的 p 的非空子串,尤其是当你的输入是字符串 p ,你需要输出字符串 sp 的不同的非空子串的数目。 


注意: p 仅由小写的英文字母组成,p 的大小可能超过 10000。


 


示例 1:



输入: "a"
输出: 1
解释: 字符串 S 中只有一个"a"子字符。

 


示例 2:



输入: "cac"
输出: 2
解释: 字符串 S 中的字符串“cac”只有两个子串“a”、“c”。.

 


示例 3:



输入: "zab"
输出: 6
解释: 在字符串 S 中有六个子串“z”、“a”、“b”、“za”、“ab”、“zab”。.

 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/468.验证IP地址.md: -------------------------------------------------------------------------------- 1 | ### 468.验证IP地址 2 | 3 | #### 1.题目描述 4 | 5 |

编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址。


IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1


同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。


IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如,  2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。而且,我们可以加入一些以 0 开头的数字,字母可以使用大写,也可以是小写。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address地址 (即,忽略 0 开头,忽略大小写)。


然而,我们不能因为某个组的值为 0,而使用一个空的组,以至于出现 (::) 的情况。 比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。


同时,在 IPv6 地址中,多余的 0 也是不被允许的。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。


说明: 你可以认为给定的字符串里没有空格或者其他特殊字符。


示例 1:



输入: "172.16.254.1"
输出: "IPv4"
解释: 这是一个有效的 IPv4 地址, 所以返回 "IPv4"。

示例 2:



输入: "2001:0db8:85a3:0:0:8A2E:0370:7334"
输出: "IPv6"
解释: 这是一个有效的 IPv6 地址, 所以返回 "IPv6"。

示例 3:



输入: "256.256.256.256"
输出: "Neither"
解释: 这个地址既不是 IPv4 也不是 IPv6 地址。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/470.用 Rand7() 实现 Rand10().md: -------------------------------------------------------------------------------- 1 | ### 470.用 Rand7() 实现 Rand10() 2 | 3 | #### 1.题目描述 4 | 5 |

已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。


不要使用系统的 Math.random() 方法。




 


示例 1:



输入: 1
输出: [7]

示例 2:



输入: 2
输出: [8,4]

示例 3:



输入: 3
输出: [8,1,10]

 


提示:



  1. rand7 已定义。

  2. 传入参数: n 表示 rand10 的调用次数。


 


进阶:



  1. rand7()调用次数的 期望值 是多少 ?

  2. 你能否尽量少调用 rand7() ?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | // The rand7() API is already defined for you. 12 | // int rand7(); 13 | // @return a random integer in the range 1 to 7 14 | 15 | int rand10() { 16 | int x; 17 | do 18 | { 19 | x = (rand7()-1) * 7 + rand7(); 20 | }while(x > 40); 21 | return x % 10 + 1; 22 | } 23 | 24 | ``` 25 | 26 | #### c++答案 27 | 28 | ```c++ 29 | 30 | // The rand7() API is already defined for you. 31 | // int rand7(); 32 | // @return a random integer in the range 1 to 7 33 | 34 | class Solution { 35 | public: 36 | int rand10() { 37 | int x = 0; 38 | do{ 39 | x = (rand7() - 1) * 7 + rand7(); 40 | }while(x > 40); 41 | return x % 10 + 1; 42 | } 43 | }; 44 | 45 | ``` 46 | 47 | #### java答案 48 | 49 | ```java 50 | 51 | -------------------------------------------------------------------------------- /problem/472.连接词.md: -------------------------------------------------------------------------------- 1 | ### 472.连接词 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词。


连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的。


示例:



输入: ["cat","cats","catsdogcats","dog","dogcatsdog","hippopotamuses","rat","ratcatdogcat"]
输出: ["catsdogcats","dogcatsdog","ratcatdogcat"]
解释: "catsdogcats"由"cats", "dog" 和 "cats"组成;
"dogcatsdog"由"dog", "cats"和"dog"组成;
"ratcatdogcat"由"rat", "cat", "dog"和"cat"组成。

说明:



  1. 给定数组的元素总数不超过 10000

  2. 给定数组中元素的长度总和不超过 600000

  3. 所有输入字符串只包含小写字母。

  4. 不需要考虑答案输出的顺序。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/473.火柴拼正方形.md: -------------------------------------------------------------------------------- 1 | ### 473.火柴拼正方形 2 | 3 | #### 1.题目描述 4 | 5 |

还记得童话《卖火柴的小女孩》吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法。不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到。


输入为小女孩拥有火柴的数目,每根火柴用其长度表示。输出即为是否能用所有的火柴拼成正方形。


示例 1:



输入: [1,1,2,2,2]
输出: true
解释: 能拼成一个边长为2的正方形,每边两根火柴。

示例 2:



输入: [3,3,3,3,4]
输出: false
解释: 不能用所有火柴拼成一个正方形。

注意:



  1. 给定的火柴长度和在 0 到 10^9之间。

  2. 火柴数组的长度不超过15。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/474.一和零.md: -------------------------------------------------------------------------------- 1 | ### 474.一和零 2 | 3 | #### 1.题目描述 4 | 5 |

在计算机界中,我们总是追求用有限的资源获取最大的收益。


现在,假设你分别支配着 m 个 0 和 n 个 1。另外,还有一个仅包含 0 和 1 字符串的数组。


你的任务是使用给定的 m 个 0 和 n 个 1 ,找到能拼出存在于数组中的字符串的最大数量。每个 0 和 1 至多被使用一次


注意:



  1. 给定 0 和 1 的数量都不会超过 100

  2. 给定字符串数组的长度不会超过 600


示例 1:



输入: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3
输出: 4
解释: 总共 4 个字符串可以通过 5 个 0 和 3 个 1 拼出,即 "10","0001","1","0" 。

示例 2:



输入: Array = {"10", "0", "1"}, m = 1, n = 1
输出: 2
解释: 你可以拼出 "10",但之后就没有剩余数字了。更好的选择是拼出 "0" 和 "1" 。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/478.在圆内随机生成点.md: -------------------------------------------------------------------------------- 1 | ### 478.在圆内随机生成点 2 | 3 | #### 1.题目描述 4 | 5 |

给定圆的半径和圆心的 x、y 坐标,写一个在圆中产生均匀随机点的函数 randPoint 。


说明:



  1. 输入值和输出值都将是浮点数

  2. 圆的半径和圆心的 x、y 坐标将作为参数传递给类的构造函数。

  3. 圆周上的点也认为是在圆中。

  4. randPoint 返回一个包含随机点的x坐标和y坐标的大小为2的数组。


示例 1:



输入:
["Solution","randPoint","randPoint","randPoint"]
[[1,0,0],[],[],[]]
输出: [null,[-0.72939,-0.65505],[-0.78502,-0.28626],[-0.83119,-0.19803]]

示例 2:



输入:
["Solution","randPoint","randPoint","randPoint"]
[[10,5,-7.5],[],[],[]]
输出: [null,[11.52438,-8.33273],[2.46992,-16.21705],[11.13430,-12.42337]]

输入语法说明:


输入是两个列表:调用成员函数名和调用的参数。Solution 的构造函数有三个参数,圆的半径、圆心的 x 坐标、圆心的 y 坐标。randPoint 没有参数。输入参数是一个列表,即使参数为空,也会输入一个 [] 空列表。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | typedef struct { 12 | double x; 13 | double y; 14 | double r; 15 | } Solution; 16 | 17 | Solution* solutionCreate(double radius, double x_center, double y_center) { 18 | Solution* solution = malloc( sizeof(Solution) ); 19 | solution->x = x_center; 20 | solution->y = y_center; 21 | solution->r = radius; 22 | srand((unsigned)time( NULL )); 23 | 24 | return solution; 25 | } 26 | 27 | double random_( int num ) 28 | { 29 | return (double)( ( (double)num /(double)RAND_MAX * rand() ) - ( (double) num / 2 ) ); 30 | } 31 | 32 | void standardRandPoint( double array[] ){ 33 | double x = random_( 2 ); 34 | double y = random_( 2 ); 35 | while( x*x + y*y > 1 ){ 36 | x = random_( 2 ); 37 | y = random_( 2 ); 38 | } 39 | array[0] = x; 40 | array[1] = y; 41 | return; 42 | } 43 | 44 | double* solutionRandPoint(Solution* obj, int *returnSize) { 45 | double* ret = malloc( 2 * sizeof(double) ); 46 | *returnSize = 2; 47 | standardRandPoint( ret ); 48 | ret[0] *= obj->r; 49 | ret[0] += obj->x; 50 | 51 | ret[1] *= obj->r; 52 | ret[1] += obj->y; 53 | 54 | return ret; 55 | } 56 | 57 | void solutionFree(Solution* obj) { 58 | free( obj ); 59 | } 60 | 61 | /** 62 | * Your Solution struct will be instantiated and called as such: 63 | * struct Solution* obj = solutionCreate(radius, x_center, y_center); 64 | * double* param_1 = solutionRandPoint(obj); 65 | * solutionFree(obj); 66 | */ 67 | 68 | ``` 69 | 70 | #### c++答案 71 | 72 | ```c++ 73 | 74 | class Solution { 75 | public: 76 | /* 77 | 我试了20多次,这道题是完完全全的数学题!!! 78 | */ 79 | Solution(double radius, double x_center, double y_center): distribution(0, 1), R(radius), X(x_center), Y(y_center) {} 80 | 81 | vector randPoint() { 82 | double theta = distribution(generator) * 2 * PI; 83 | double r = sqrt(distribution(generator)) * R; 84 | return {X + r * cos(theta), Y + r * sin(theta)}; 85 | } 86 | private: 87 | const double PI = 3.1415926535897932384626; 88 | std::default_random_engine generator; 89 | std::uniform_real_distribution distribution; 90 | const double R; 91 | const double X; 92 | const double Y; 93 | }; 94 | 95 | /** 96 | * Your Solution object will be instantiated and called as such: 97 | * Solution obj = new Solution(radius, x_center, y_center); 98 | * vector param_1 = obj.randPoint(); 99 | */ 100 | 101 | ``` 102 | 103 | #### java答案 104 | 105 | ```java 106 | 107 | -------------------------------------------------------------------------------- /problem/479.最大回文数乘积.md: -------------------------------------------------------------------------------- 1 | ### 479.最大回文数乘积 2 | 3 | #### 1.题目描述 4 | 5 |

你需要找到由两个 n 位数的乘积组成的最大回文数。


由于结果会很大,你只需返回最大回文数 mod 1337得到的结果。


示例:


输入: 2


输出: 987


解释: 99 x 91 = 9009, 9009 % 1337 = 987


说明:


n 的取值范围为 [1,8]。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/480.滑动窗口中位数.md: -------------------------------------------------------------------------------- 1 | ### 480.滑动窗口中位数 2 | 3 | #### 1.题目描述 4 | 5 |

中位数是有序序列最中间的那个数。如果序列的大小是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。


例如:


[2,3,4],中位数是 3


[2,3],中位数是 (2 + 3) / 2 = 2.5


给出一个数组 nums,有一个大小为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。


例如:


给出 nums = [1,3,-1,-3,5,3,6,7],以及 k = 3。



窗口位置 中位数
--------------- -----
[1 3 -1] -3 5 3 6 7 1
1 [3 -1 -3] 5 3 6 7 -1
1 3 [-1 -3 5] 3 6 7 -1
1 3 -1 [-3 5 3] 6 7 3
1 3 -1 -3 [5 3 6] 7 5
1 3 -1 -3 5 [3 6 7] 6

 因此,返回该滑动窗口的中位数数组 [1,-1,-1,3,5,6]


提示:

假设k是合法的,即:k 始终小于输入的非空数组的元素个数.


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/481.神奇字符串.md: -------------------------------------------------------------------------------- 1 | ### 481.神奇字符串 2 | 3 | #### 1.题目描述 4 | 5 |

神奇的字符串 只包含 '1' 和 '2',并遵守以下规则:


字符串 S 是神奇的,因为串联字符 '1' 和 '2' 的连续出现次数会生成字符串 S 本身。


字符串 的前几个元素如下:S = “1221121221221121122 ......”


如果我们将 S 中连续的 1 和 2 进行分组,它将变成:


1 22 11 2 1 22 1 22 11 2 11 22 ......


并且每个组中 '1' 或 '2' 的出现次数分别是:


1 2 2 1 1 2 1 2 2 1 2 2 ......


你可以看到上面的出现次数就是 S 本身。


给定一个整数 N 作为输入,返回神奇字符串 中前 N 个数字中的 '1' 的数目。


注意:N 不会超过 100,000。


示例:


输入:6
输出:3
解释:神奇字符串 S 的前 6 个元素是 “12211”,它包含三个 1,因此返回 3。

 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/482.密钥格式化.md: -------------------------------------------------------------------------------- 1 | ### 482.密钥格式化 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个密钥字符串S,只包含字母,数字以及 '-'(破折号)。N 个 '-' 将字符串分成了 N+1 组。给定一个数字 K,重新格式化字符串,除了第一个分组以外,每个分组要包含 K 个字符,第一个分组至少要包含 1 个字符。两个分组之间用 '-'(破折号)隔开,并且将所有的小写字母转换为大写字母。


给定非空字符串 S 和数字 K,按照上面描述的规则进行格式化。


示例 1:



输入:S = "5F3Z-2e-9-w", K = 4
输出:"5F3Z-2E9W"
解释:字符串 S 被分成了两个部分,每部分 4 个字符;
  注意,两个额外的破折号需要删掉。

示例 2:



输入:S = "2-5g-3-J", K = 2
输出:"2-5G-3J"
解释:字符串 S 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。

 


提示:



  1. S 的长度不超过 12,000,K 为正整数

  2. S 只包含字母数字(a-z,A-Z,0-9)以及破折号'-'

  3. S 非空


 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/483.最小好进制.md: -------------------------------------------------------------------------------- 1 | ### 483.最小好进制 2 | 3 | #### 1.题目描述 4 | 5 |

对于给定的整数 n, 如果n的k(k>=2)进制数的所有数位全为1,则称 k(k>=2)是 n 的一个好进制


以字符串的形式给出 n, 以字符串的形式返回 n 的最小好进制。


 


示例 1:



输入:"13"
输出:"3"
解释:13 的 3 进制是 111。

示例 2:



输入:"4681"
输出:"8"
解释:4681 的 8 进制是 11111。

示例 3:



输入:"1000000000000000000"
输出:"999999999999999999"
解释:1000000000000000000 的 999999999999999999 进制是 11。

 


提示:



  1. n的取值范围是 [3, 10^18]。

  2. 输入总是有效且没有前导 0。


 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/485.最大连续1的个数.md: -------------------------------------------------------------------------------- 1 | ### 485.最大连续1的个数 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个二进制数组, 计算其中最大连续1的个数。


示例 1:



输入: [1,1,0,1,1,1]
输出: 3
解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.

注意:



  • 输入的数组只包含 01

  • 输入数组的长度是正整数,且不超过 10,000。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/486.预测赢家.md: -------------------------------------------------------------------------------- 1 | ### 486.预测赢家 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个表示分数的非负整数数组。 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,……。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。


给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。


示例 1:



输入: [1, 5, 2]
输出: False
解释: 一开始,玩家1可以从1和2中进行选择。
如果他选择2(或者1),那么玩家2可以从1(或者2)和5中进行选择。如果玩家2选择了5,那么玩家1则只剩下1(或者2)可选。
所以,玩家1的最终分数为 1 + 2 = 3,而玩家2为 5。
因此,玩家1永远不会成为赢家,返回 False。

示例 2:



输入: [1, 5, 233, 7]
输出: True
解释: 玩家1一开始选择1。然后玩家2必须从5和7中进行选择。无论玩家2选择了哪个,玩家1都可以选择233。
最终,玩家1(234分)比玩家2(12分)获得更多的分数,所以返回 True,表示玩家1可以成为赢家。

注意:



  1. 1 <= 给定的数组长度 <= 20.

  2. 数组里所有分数都为非负数且不会大于10000000。

  3. 如果最终两个玩家的分数相等,那么玩家1仍为赢家。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/488.祖玛游戏.md: -------------------------------------------------------------------------------- 1 | ### 488.祖玛游戏 2 | 3 | #### 1.题目描述 4 | 5 |

回忆一下祖玛游戏。现在桌上有一串球,颜色有红色(R),黄色(Y),蓝色(B),绿色(G),还有白色(W)。 现在你手里也有几个球。


每一次,你可以从手里的球选一个,然后把这个球插入到一串球中的某个位置上(包括最左端,最右端)。接着,如果有出现三个或者三个以上颜色相同的球相连的话,就把它们移除掉。重复这一步骤直到桌上所有的球都被移除。


找到插入并可以移除掉桌上所有球所需的最少的球数。如果不能移除桌上所有的球,输出 -1 。



示例:
输入: "WRRBBW", "RB"
输出: -1
解释: WRRBBW -> WRR[R]BBW -> WBBW -> WBB[B]W -> WW (翻译者标注:手上球已经用完,桌上还剩两个球无法消除,返回-1)
输入: "WWRRBBWW", "WRBRW"
输出: 2
解释: WWRRBBWW -> WWRR[R]BBWW -> WWBBWW -> WWBB[B]WW -> WWWW -> empty
输入:"G", "GGGGG"
输出: 2
解释: G -> G[G] -> GG[G] -> empty
输入: "RBYYBBRRB", "YRBGB"
输出: 3
解释: RBYYBBRRB -> RBYY[Y]BBRRB -> RBBBRRB -> RRRB -> B -> B[B] -> BB[B] -> empty

标注:



  1. 你可以假设桌上一开始的球中,不会有三个及三个以上颜色相同且连着的球。

  2. 桌上的球不会超过20个,输入的数据中代表这些球的字符串的名字是 "board" 。

  3. 你手中的球不会超过5个,输入的数据中代表这些球的字符串的名字是 "hand"。

  4. 输入的两个字符串均为非空字符串,且只包含字符 'R','Y','B','G','W'。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/491.递增子序列.md: -------------------------------------------------------------------------------- 1 | ### 491.递增子序列 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。


示例:



输入: [4, 6, 7, 7]
输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]

说明:



  1. 给定数组的长度不会超过15。

  2. 数组中的整数范围是 [-100,100]。

  3. 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/492.构造矩形.md: -------------------------------------------------------------------------------- 1 | ### 492.构造矩形 2 | 3 | #### 1.题目描述 4 | 5 |

作为一位web开发者, 懂得怎样去规划一个页面的尺寸是很重要的。 现给定一个具体的矩形页面面积,你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求:



1. 你设计的矩形页面必须等于给定的目标面积。
2. 宽度 W 不应大于长度 L,换言之,要求 L >= W 。
3. 长度 L 和宽度 W 之间的差距应当尽可能小。

你需要按顺序输出你设计的页面的长度 L 和宽度 W。


示例:



输入: 4
输出: [2, 2]
解释: 目标面积是 4, 所有可能的构造方案有 [1,4], [2,2], [4,1]。
但是根据要求2,[1,4] 不符合要求; 根据要求3,[2,2] 比 [4,1] 更能符合要求. 所以输出长度 L 为 2, 宽度 W 为 2。

说明:



  1. 给定的面积不大于 10,000,000 且为正整数。

  2. 你设计的页面的长度和宽度必须都是正整数。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/494.目标和.md: -------------------------------------------------------------------------------- 1 | ### 494.目标和 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个非负整数数组,a1, a2, ..., an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。


返回可以使最终数组和为目标数 S 的所有添加符号的方法数。


示例 1:



输入: nums: [1, 1, 1, 1, 1], S: 3
输出: 5
解释:
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
一共有5种方法让最终目标和为3。

注意:



  1. 数组的长度不会超过20,并且数组中的值全为正数。

  2. 初始的数组的和不会超过1000。

  3. 保证返回的最终结果为32位整数。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/497.非重叠矩形中的随机点.md: -------------------------------------------------------------------------------- 1 | ### 497.非重叠矩形中的随机点 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个非重叠轴对齐矩形的列表 rects,写一个函数 pick 随机均匀地选取矩形覆盖的空间中的整数点。


提示:



  1. 整数点是具有整数坐标的点。

  2. 矩形周边上的点包含在矩形覆盖的空间中。

  3. i 个矩形 rects [i] = [x1,y1,x2,y2],其中 [x1,y1] 是左下角的整数坐标,[x2,y2] 是右上角的整数坐标。

  4. 每个矩形的长度和宽度不超过 2000。

  5. 1 <= rects.length <= 100

  6. pick 以整数坐标数组 [p_x, p_y] 的形式返回一个点。

  7. pick 最多被调用10000次。


 


示例 1:



输入:
["Solution","pick","pick","pick"]
[[[[1,1,5,5]]],[],[],[]]
输出:
[null,[4,1],[4,1],[3,3]]

示例 2:



输入:
["Solution","pick","pick","pick","pick","pick"]
[[[[-2,-2,-1,-1],[1,0,3,0]]],[],[],[],[],[]]
输出:
[null,[-1,-2],[2,0],[-2,-1],[3,0],[-2,-2]]

 


输入语法的说明:


输入是两个列表:调用的子例程及其参数。Solution 的构造函数有一个参数,即矩形数组 rectspick 没有参数。参数总是用列表包装的,即使没有也是如此。


 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/498.对角线遍历.md: -------------------------------------------------------------------------------- 1 | ### 498.对角线遍历 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个含有 M x N 个元素的矩阵(M行,N列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。


示例:



输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
解释:


说明:



  1. 给定矩阵中的元素总数不会超过 100000 。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/500.键盘行.md: -------------------------------------------------------------------------------- 1 | ### 500.键盘行 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。键盘如下图所示。





American keyboard




示例1:



输入: ["Hello", "Alaska", "Dad", "Peace"]

输出: ["Alaska", "Dad"]


注意:




  1. 你可以重复使用键盘上同一字符。

  2. 你可以假设输入的字符串将只包含字母。

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/502.IPO.md: -------------------------------------------------------------------------------- 1 | ### 502.IPO 2 | 3 | #### 1.题目描述 4 | 5 |

假设 LeetCode 即将开始其 IPO。为了以更高的价格将股票卖给风险投资公司,LeetCode希望在 IPO 之前开展一些项目以增加其资本。 由于资源有限,它只能在 IPO 之前完成最多 k 个不同的项目。帮助 LeetCode 设计完成最多 k 个不同项目后得到最大总资本的方式。


给定若干个项目。对于每个项目 i,它都有一个纯利润 Pi,并且需要最小的资本 Ci 来启动相应的项目。最初,你有 W 资本。当你完成一个项目时,你将获得纯利润,且利润将被添加到你的总资本中。


总而言之,从给定项目中选择最多 k 个不同项目的列表,以最大化最终资本,并输出最终可获得的最多资本。


示例 1:



输入: k=2, W=0, Profits=[1,2,3], Capital=[0,1,1].
输出: 4
解释:
由于你的初始资本为 0,你尽可以从 0 号项目开始。
在完成后,你将获得 1 的利润,你的总资本将变为 1。
此时你可以选择开始 1 号或 2 号项目。
由于你最多可以选择两个项目,所以你需要完成 2 号项目以获得最大的资本。
因此,输出最后最大化的资本,为 0 + 1 + 3 = 4。

 


注意:



  1. 假设所有输入数字都是非负整数。

  2. 表示利润和资本的数组的长度不超过 50000。

  3. 答案保证在 32 位有符号整数范围内。


 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/503.下一个更大元素 II.md: -------------------------------------------------------------------------------- 1 | ### 503.下一个更大元素 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。


示例 1:



输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

注意: 输入数组的长度不会超过 10000。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/504.七进制数.md: -------------------------------------------------------------------------------- 1 | ### 504.七进制数 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数,将其转化为7进制,并以字符串形式输出。


示例 1:



输入: 100
输出: "202"

示例 2:



输入: -7
输出: "-10"

注意: 输入范围是 [-1e7, 1e7] 。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/506.相对名次.md: -------------------------------------------------------------------------------- 1 | ### 506.相对名次 2 | 3 | #### 1.题目描述 4 | 5 |

给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌。前三名运动员将会被分别授予 “金牌”,“银牌” 和“ 铜牌”("Gold Medal", "Silver Medal", "Bronze Medal")。


(注:分数越高的选手,排名越靠前。)


示例 1:



输入: [5, 4, 3, 2, 1]
输出: ["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"]
解释: 前三名运动员的成绩为前三高的,因此将会分别被授予 “金牌”,“银牌”和“铜牌” ("Gold Medal", "Silver Medal" and "Bronze Medal").
余下的两名运动员,我们只需要通过他们的成绩计算将其相对名次即可。

提示:



  1. N 是一个正整数并且不会超过 10000。

  2. 所有运动员的成绩都不相同。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/507.完美数.md: -------------------------------------------------------------------------------- 1 | ### 507.完美数 2 | 3 | #### 1.题目描述 4 | 5 |

对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。


给定一个 正整数 n, 如果他是完美数,返回 True,否则返回 False


 


示例:



输入: 28
输出: True
解释: 28 = 1 + 2 + 4 + 7 + 14

 


注意:


输入的数字 n 不会超过 100,000,000. (1e8)


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | bool checkPerfectNumber(int num) { 12 | int i,j,k = 1; 13 | if(num <= 1) 14 | return false; 15 | if(sqrt(num)*sqrt(num) == num) 16 | k = k+sqrt(num); 17 | for(i = 2; i < sqrt(num); i++) 18 | { 19 | if(num%i == 0) 20 | k = k+i+num/i; 21 | } 22 | if(k == num) 23 | return true; 24 | else 25 | return false; 26 | } 27 | 28 | ``` 29 | 30 | #### c++答案 31 | 32 | ```c++ 33 | 34 | class Solution { 35 | public: 36 | bool checkPerfectNumber(int num) { 37 | if (num == 1) 38 | return false; 39 | int tot = 0; 40 | for (int i = 2; i * i <= num; i++) 41 | if (num % i == 0) { 42 | tot += i; 43 | if (i * i != num) 44 | tot += num / i; 45 | } 46 | return tot + 1 == num; 47 | } 48 | }; 49 | 50 | ``` 51 | 52 | #### java答案 53 | 54 | ```java 55 | 56 | class Solution { 57 | public boolean checkPerfectNumber(int num) { 58 | return num==6||num==28||num==496||num==8128||num==33550336; 59 | } 60 | } 61 | 62 | ``` 63 | 64 | #### JavaScript答案 65 | 66 | ```javascript 67 | 68 | /** 69 | * @param {number} num 70 | * @return {boolean} 71 | */ 72 | var checkPerfectNumber = function(num) { 73 | /* let arr = [1]; 74 | for(let i=2;i<=num/2;i++){ 75 | if(num%i===0){ 76 | arr.push(i) 77 | } 78 | } 79 | const sum = arr.reduce((a,b)=>a+b); 80 | return num===1?false:num===sum;*/ 81 | 82 | let sum = 1; 83 | for(let i=2;i<=Math.sqrt(num);i++){ 84 | if(num%i===0){ 85 | sum+=i; 86 | if(num/i!==i){ 87 | sum+=num/i 88 | } 89 | } 90 | } 91 | 92 | return num===1?false:num===sum; 93 | }; 94 | 95 | ``` 96 | 97 | #### c#答案 98 | 99 | ```c# 100 | 101 | public class Solution { 102 | public bool CheckPerfectNumber(int num) { 103 | int k = 1; 104 | for (int i = 2; i < Math.Sqrt(num); i++) 105 | { 106 | if (num % i == 0) 107 | { 108 | k += i + num/i; 109 | } 110 | } 111 | if(num == k && num != 1) 112 | { 113 | return true; 114 | } 115 | return false; 116 | } 117 | } 118 | 119 | 120 | ``` 121 | 122 | #### python2.x答案 123 | 124 | ```python 125 | 126 | class Solution(object): 127 | def checkPerfectNumber(self, num): 128 | """ 129 | :type num: int 130 | :rtype: bool 131 | """ 132 | ans = 1 133 | div = 2 134 | while div ** 2 <= num: 135 | if num % div == 0: 136 | ans += div 137 | ans += num / div 138 | div += 1 139 | return ans == num if num != 1 else False 140 | 141 | ``` 142 | 143 | #### python3.x答案 144 | 145 | ```python 146 | 147 | import math 148 | class Solution: 149 | def checkPerfectNumber(self, num): 150 | if num<=1: 151 | return False 152 | return sum([i+num/i for i in range(2,int(math.sqrt(num))+1) if num%i==0])==num-1 153 | 154 | ``` 155 | 156 | #### go答案 157 | 158 | ```go 159 | 160 | func checkPerfectNumber(num int) bool { 161 | if num<2 { 162 | return false 163 | } 164 | sum:=1 165 | for i:=2;i*i<=num;i++ { 166 | if i*i==num { 167 | sum+=i 168 | return sum==num 169 | } 170 | if num%i==0 { 171 | sum+=(i+num/i) 172 | } 173 | if sum>num { 174 | return false 175 | } 176 | fmt.Println(sum) 177 | } 178 | return num==sum 179 | } 180 | 181 | ``` -------------------------------------------------------------------------------- /problem/515.在每个树行中找最大值.md: -------------------------------------------------------------------------------- 1 | ### 515.在每个树行中找最大值 2 | 3 | #### 1.题目描述 4 | 5 |

您需要在二叉树的每一行中找到最大的值。


示例:



输入:
1
/ \
3 2
/ \ \
5 3 9
输出: [1, 3, 9]

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/516.最长回文子序列.md: -------------------------------------------------------------------------------- 1 | ### 516.最长回文子序列 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个字符串s,找到其中最长的回文子序列。可以假设s的最大长度为1000


示例 1:

输入:



"bbbab"

输出:



4

一个可能的最长回文子序列为 "bbbb"。


示例 2:

输入:



"cbbd"

输出:



2

一个可能的最长回文子序列为 "bb"。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/517.超级洗衣机.md: -------------------------------------------------------------------------------- 1 | ### 517.超级洗衣机 2 | 3 | #### 1.题目描述 4 | 5 |

假设有 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。


每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。


给定一个非负整数数组代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的最少的操作步数。如果不能使每台洗衣机中衣物的数量相等,则返回 -1。


 


示例 1:


输入: [1,0,5]
输出: 3
解释:
第一步: 1 0 <-- 5 => 1 1 4
第二步: 1 <-- 1 <-- 4 => 2 1 3
第三步: 2 1 <-- 3 => 2 2 2

示例 2:


输入: [0,3,0]
输出: 2
解释:
第一步: 0 <-- 3 0 => 1 2 0
第二步: 1 2 --> 0 => 1 1 1

示例 3:


输入: [0,2,0]
输出: -1
解释:
不可能让所有三个洗衣机同时剩下相同数量的衣物。

 


提示:



  1. n 的范围是 [1, 10000]。

  2. 在每台超级洗衣机中,衣物数量的范围是 [0, 1e5]。


 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/519.随机翻转矩阵.md: -------------------------------------------------------------------------------- 1 | ### 519.随机翻转矩阵 2 | 3 | #### 1.题目描述 4 | 5 |

题中给出一个 nn 列的二维矩阵 (n_rows,n_cols),且所有值被初始化为 0。要求编写一个 flip 函数,均匀随机的将矩阵中的 0 变为 1,并返回该值的位置下标 [row_id,col_id];同样编写一个 reset 函数,将所有的值都重新置为 0。尽量最少调用随机函数 Math.random(),并且优化时间和空间复杂度。


注意:


1.1 <= n_rows, n_cols <= 10000


2. 0 <= row.id < n_rows 并且 0 <= col.id < n_cols


3.当矩阵中没有值为 0 时,不可以调用 flip 函数


4.调用 flip 和 reset 函数的次数加起来不会超过 1000 次


示例 1:



输入:
["Solution","flip","flip","flip","flip"]
[[2,3],[],[],[],[]]
输出: [null,[0,1],[1,2],[1,0],[1,1]]

示例 2:



输入:
["Solution","flip","flip","reset","flip"]
[[1,2],[],[],[],[]]
输出: [null,[0,0],[0,1],null,[0,0]]

输入语法解释:


输入包含两个列表:被调用的子程序和他们的参数。Solution 的构造函数有两个参数,分别为 n_rowsn_colsflip 和 reset 没有参数,参数总会以列表形式给出,哪怕该列表为空


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/520.检测大写字母.md: -------------------------------------------------------------------------------- 1 | ### 520.检测大写字母 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个单词,你需要判断单词的大写使用是否正确。


我们定义,在以下情况时,单词的大写用法是正确的:



  1. 全部字母都是大写,比如"USA"。

  2. 单词中所有字母都不是大写,比如"leetcode"。

  3. 如果单词不只含有一个字母,只有首字母大写, 比如 "Google"。


否则,我们定义这个单词没有正确使用大写字母。


示例 1:



输入: "USA"
输出: True

示例 2:



输入: "FlaG"
输出: False

注意: 输入是由大写和小写拉丁字母组成的非空单词。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/521.最长特殊序列 Ⅰ.md: -------------------------------------------------------------------------------- 1 | ### 521.最长特殊序列 Ⅰ 2 | 3 | #### 1.题目描述 4 | 5 |

给定两个字符串,你需要从这两个字符串中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。


子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。


输入为两个字符串,输出最长特殊序列的长度。如果不存在,则返回 -1。


示例 :


输入: "aba", "cdc"
输出: 3
解析: 最长特殊序列可为 "aba" (或 "cdc")

说明:



  1. 两个字符串长度均小于100。

  2. 字符串中的字符仅含有 'a'~'z'。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/522.最长特殊序列 II.md: -------------------------------------------------------------------------------- 1 | ### 522.最长特殊序列 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。


子序列可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。


输入将是一个字符串列表,输出是最长特殊序列的长度。如果最长特殊序列不存在,返回 -1 。


 


示例:


输入: "aba", "cdc", "eae"
输出: 3

 


提示:



  1. 所有给定的字符串长度不会超过 10 。

  2. 给定字符串列表的长度将在 [2, 50 ] 之间。


 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/528.按权重随机选择.md: -------------------------------------------------------------------------------- 1 | ### 528.按权重随机选择 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个正整数数组 w ,其中 w[i] 代表位置 i 的权重,请写一个函数 pickIndex ,它可以随机地获取位置 i,选取位置 i 的概率与 w[i] 成正比。


说明:



  1. 1 <= w.length <= 10000

  2. 1 <= w[i] <= 10^5

  3. pickIndex 将被调用不超过 10000 次


示例1:



输入:
["Solution","pickIndex"]
[[[1]],[]]
输出: [null,0]

示例2:



输入:
["Solution","pickIndex","pickIndex","pickIndex","pickIndex","pickIndex"]
[[[1,3]],[],[],[],[],[]]
输出: [null,0,1,1,1,0]

输入语法说明:


输入是两个列表:调用成员函数名和调用的参数。Solution 的构造函数有一个参数,即数组 wpickIndex 没有参数。输入参数是一个列表,即使参数为空,也会输入一个 [] 空列表。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/529.扫雷游戏.md: -------------------------------------------------------------------------------- 1 | ### 529.扫雷游戏 2 | 3 | #### 1.题目描述 4 | 5 |

让我们一起来玩扫雷游戏!


给定一个代表游戏板的二维字符矩阵。 'M' 代表一个未挖出的地雷,'E' 代表一个未挖出的空方块,'B' 代表没有相邻(上,下,左,右,和所有4个对角线)地雷的已挖出的空白方块,数字('1' 到 '8')表示有多少地雷与这块已挖出的方块相邻,'X' 则表示一个已挖出的地雷。


现在给出在所有未挖出的方块中('M'或者'E')的下一个点击位置(行和列索引),根据以下规则,返回相应位置被点击后对应的面板:



  1. 如果一个地雷('M')被挖出,游戏就结束了- 把它改为 'X'

  2. 如果一个没有相邻地雷的空方块('E')被挖出,修改它为('B'),并且所有和其相邻的方块都应该被递归地揭露。

  3. 如果一个至少与一个地雷相邻的空方块('E')被挖出,修改它为数字('1'到'8'),表示相邻地雷的数量。

  4. 如果在此次点击中,若无更多方块可被揭露,则返回面板。


示例 1:



输入:
[['E', 'E', 'E', 'E', 'E'],
['E', 'E', 'M', 'E', 'E'],
['E', 'E', 'E', 'E', 'E'],
['E', 'E', 'E', 'E', 'E']]
Click : [3,0]
输出:
[['B', '1', 'E', '1', 'B'],
['B', '1', 'M', '1', 'B'],
['B', '1', '1', '1', 'B'],
['B', 'B', 'B', 'B', 'B']]
解释:


示例 2:



输入:
[['B', '1', 'E', '1', 'B'],
['B', '1', 'M', '1', 'B'],
['B', '1', '1', '1', 'B'],
['B', 'B', 'B', 'B', 'B']]
Click : [1,2]
输出:
[['B', '1', 'E', '1', 'B'],
['B', '1', 'X', '1', 'B'],
['B', '1', '1', '1', 'B'],
['B', 'B', 'B', 'B', 'B']]
解释:


注意:



  1. 输入矩阵的宽和高的范围为 [1,50]。

  2. 点击的位置只能是未被挖出的方块 ('M' 或者 'E'),这也意味着面板至少包含一个可点击的方块。

  3. 输入面板不会是游戏结束的状态(即有地雷已被挖出)。

  4. 简单起见,未提及的规则在这个问题中可被忽略。例如,当游戏结束时你不需要挖出所有地雷,考虑所有你可能赢得游戏或标记方块的情况。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/530.二叉搜索树的最小绝对差.md: -------------------------------------------------------------------------------- 1 | ### 530.二叉搜索树的最小绝对差 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个所有节点为非负值的二叉搜索树,求树中任意两节点的差的绝对值的最小值。


示例 :



输入:
1
\
3
/
2
输出:
1
解释:
最小绝对差为1,其中 2 和 1 的差的绝对值为 1(或者 2 和 3)。

注意: 树中至少有2个节点。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/532.数组中的K-diff数对.md: -------------------------------------------------------------------------------- 1 | ### 532.数组中的K-diff数对 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i j 都是数组中的数字,且两数之差的绝对值是 k.


示例 1:



输入: [3, 1, 4, 1, 5], k = 2
输出: 2
解释: 数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个1,但我们只应返回不同的数对的数量。

示例 2:



输入:[1, 2, 3, 4, 5], k = 1
输出: 4
解释: 数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5)。

示例 3:



输入: [1, 3, 1, 5, 4], k = 0
输出: 1
解释: 数组中只有一个 0-diff 数对,(1, 1)。

注意:



  1. 数对 (i, j) 和数对 (j, i) 被算作同一数对。

  2. 数组的长度不超过10,000。

  3. 所有输入的整数的范围在 [-1e7, 1e7]。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/537.复数乘法.md: -------------------------------------------------------------------------------- 1 | ### 537.复数乘法 2 | 3 | #### 1.题目描述 4 | 5 |

给定两个表示复数的字符串。


返回表示它们乘积的字符串。注意,根据定义 i2 = -1 。


示例 1:



输入: "1+1i", "1+1i"
输出: "0+2i"
解释: (1 + i) * (1 + i) = 1 + i2 + 2 * i = 2i ,你需要将它转换为 0+2i 的形式。

示例 2:



输入: "1+-1i", "1+-1i"
输出: "0+-2i"
解释: (1 - i) * (1 - i) = 1 + i2 - 2 * i = -2i ,你需要将它转换为 0+-2i 的形式。

注意:



  1. 输入字符串不包含额外的空格。

  2. 输入字符串将以 a+bi 的形式给出,其中整数 ab 的范围均在 [-100, 100] 之间。输出也应当符合这种形式


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/538.把二叉搜索树转换为累加树.md: -------------------------------------------------------------------------------- 1 | ### 538.把二叉搜索树转换为累加树 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。


例如:



输入: 二叉搜索树:
5
/ \
2 13
输出: 转换为累加树:
18
/ \
20 13

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/539.最小时间差.md: -------------------------------------------------------------------------------- 1 | ### 539.最小时间差 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个 24 小时制(小时:分钟)的时间列表,找出列表中任意两个时间的最小时间差并已分钟数表示。




示例 1:



输入: ["23:59","00:00"]
输出: 1



备注:



  1. 列表中时间数在 2~20000 之间。

  2. 每个时间取值在 00:00~23:59 之间。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/540.有序数组中的单一元素.md: -------------------------------------------------------------------------------- 1 | ### 540.有序数组中的单一元素 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个只包含整数的有序数组,每个元素都会出现两次,唯有一个数只会出现一次,找出这个数。


示例 1:



输入: [1,1,2,3,3,4,4,8,8]
输出: 2

示例 2:



输入: [3,3,7,7,10,11,11]
输出: 10

注意: 您的方案应该在 O(log n)时间复杂度和 O(1)空间复杂度中运行。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int singleNonDuplicate(int* a, int l) 12 | { 13 | for(int i = 0, m = l / 2; i < l; m = (i + l) / 2) 14 | { 15 | if( a[m] != a[m-1] && a[m] != a[m+1] ) 16 | return a[m]; 17 | (a[m] == a[m-1]) == (m & 1 == 1) ? (i = m + 1) : (l = m); 18 | } 19 | return a[0]; 20 | } 21 | 22 | 23 | ``` 24 | 25 | #### c++答案 26 | 27 | ```c++ 28 | 29 | class Solution { 30 | public: 31 | int singleNonDuplicate(vector& nums) { 32 | /*int res=0; 33 | for(int i=0;i e); 104 | return group.Where(e => e.Count() == 1).Select(e => e.Key).First(); 105 | } 106 | } 107 | 108 | ``` 109 | 110 | #### python2.x答案 111 | 112 | ```python 113 | 114 | class Solution(object): 115 | def singleNonDuplicate(self, nums): 116 | """ 117 | :type nums: List[int] 118 | :rtype: int 119 | """ 120 | a=0 121 | for i in range(len(nums)): 122 | a=nums[i]^a 123 | return a 124 | 125 | 126 | ``` 127 | 128 | #### python3.x答案 129 | 130 | ```python 131 | 132 | class Solution: 133 | def singleNonDuplicate(self, nums): 134 | """ 135 | :type nums: List[int] 136 | :rtype: int 137 | """ 138 | num = 0 139 | 140 | for i in range(len(nums)) : 141 | if i % 2 == 0 : 142 | num += nums[i] 143 | else: 144 | num -= nums[i] 145 | 146 | return num 147 | 148 | ``` 149 | 150 | #### go答案 151 | 152 | ```go 153 | 154 | func singleNonDuplicate(nums []int) int { 155 | l, h := 0, len(nums)-1 156 | for l < h { 157 | mid := l + (h - l)/2 158 | if mid % 2 == 1{ 159 | mid-- 160 | } 161 | if nums[mid] == nums[mid+1] { 162 | l = mid + 2 163 | }else{ 164 | h = mid 165 | } 166 | } 167 | return nums[l] 168 | } 169 | 170 | ``` -------------------------------------------------------------------------------- /problem/543.二叉树的直径.md: -------------------------------------------------------------------------------- 1 | ### 543.二叉树的直径 2 | 3 | #### 1.题目描述 4 | 5 |

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。


示例 :

给定二叉树



1
/ \
2 3
/ \
4 5

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。


注意:两结点之间的路径长度是以它们之间边的数目表示。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/546.移除盒子.md: -------------------------------------------------------------------------------- 1 | ### 546.移除盒子 2 | 3 | #### 1.题目描述 4 | 5 |

给出一些不同颜色的盒子,盒子的颜色由数字表示,即不同的数字表示不同的颜色。

你将经过若干轮操作去去掉盒子,直到所有的盒子都去掉为止。每一轮你可以移除具有相同颜色的连续 k 个盒子(k >= 1),这样一轮之后你将得到 k*k 个积分。

当你将所有盒子都去掉之后,求你能获得的最大积分和。


示例 1:

输入:



[1, 3, 2, 2, 2, 3, 4, 3, 1]

输出:



23

解释:



[1, 3, 2, 2, 2, 3, 4, 3, 1]
----> [1, 3, 3, 4, 3, 1] (3*3=9 分)
----> [1, 3, 3, 3, 1] (1*1=1 分)
----> [1, 1] (3*3=9 分)
----> [] (2*2=4 分)

 


提示:盒子的总数 n 不会超过 100。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/552.学生出勤记录 II.md: -------------------------------------------------------------------------------- 1 | ### 552.学生出勤记录 II 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个正整数 n,返回长度为 n 的所有可被视为可奖励的出勤记录的数量。 答案可能非常大,你只需返回结果mod 109 + 7的值。


学生出勤记录是只包含以下三个字符的字符串:



  1. 'A' : Absent,缺勤

  2. 'L' : Late,迟到

  3. 'P' : Present,到场


如果记录不包含多于一个'A'(缺勤)超过两个连续的'L'(迟到),则该记录被视为可奖励的。


示例 1:



输入: n = 2
输出: 8
解释:

有8个长度为2的记录将被视为可奖励:
"PP" , "AP", "PA", "LP", "PL", "AL", "LA", "LL"
只有"AA"不会被视为可奖励,因为缺勤次数超过一次。

注意:n 的值不会超过100000。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | long long ans[100000+5]; 12 | 13 | int checkRecord(int n) { 14 | ans[0]=1; 15 | ans[1]=2; 16 | ans[2]=4; 17 | ans[3]=7; 18 | 19 | int M = 1000000007; 20 | 21 | for(int i=4;i P(n + 1), PorL(n + 1); 47 | P[0] = 1; PorL[0] = 1; PorL[1] = 2; 48 | for (int i = 1; i <= n; ++i) { 49 | P[i] = PorL[i - 1]; 50 | if (i > 1) PorL[i] = (P[i] + P[i - 1] + P[i - 2]) % M; 51 | } 52 | long long res = PorL[n]; 53 | for (int i = 0; i < n; ++i) { 54 | long long t = (PorL[i] * PorL[n - 1 - i]) % M; 55 | res = (res + t) % M; 56 | } 57 | return res; 58 | } 59 | }; 60 | 61 | ``` 62 | 63 | #### java答案 64 | 65 | ```java 66 | 67 | class Solution { 68 | private static final int M = 1000000007; 69 | 70 | public int checkRecord(int n) { 71 | 72 | if(n == 1) return 3; 73 | 74 | if(n == 2) return 8; 75 | 76 | 77 | int[] P = new int[n]; 78 | 79 | int[] L = new int[n]; 80 | 81 | int[] A = new int[n]; 82 | 83 | 84 | P[0] = 1; L[0] = 1; A[0] = 1; 85 | 86 | L[1] = 3;A[1] = 2; 87 | 88 | A[2] = 4; 89 | 90 | 91 | for(int i = 1;i < n;i++){ 92 | 93 | P[i] = ((A[i - 1] + P[i - 1]) % M + L[i - 1]) % M; 94 | 95 | if(i >= 2) L[i] = ((A[i - 1] + P[i - 1]) % M + (A[i - 2] + P[i - 2]) % M) % M; 96 | 97 | if(i >= 3) A[i] = ((A[i - 1] + A[i - 2]) % M + A[i - 3]) % M; 98 | 99 | } 100 | 101 | 102 | return ((A[n - 1] % M + L[n - 1] % M) % M + P[n - 1] % M) % M; 103 | 104 | } 105 | } 106 | 107 | ``` 108 | 109 | #### JavaScript答案 110 | 111 | ```javascript 112 | 113 | /** 114 | * @param {number} n 115 | * @return {number} 116 | */ 117 | var checkRecord = function(n) { 118 | if(n == 1) return 3; 119 | if(n == 2) return 8; 120 | if(n == 3) return 19; 121 | var cn_3 = 1; //c1 122 | var an_3 = 3; //a1 123 | var cn_2 = 2; //c2 124 | var an_2 = 8; //a2 125 | var cn_1 = 4; //c3 126 | var an_1 = 19; //a3 127 | var cn = 0; 128 | var an = 0; 129 | for(var i = 4; i<= n; i++){ 130 | cn = (cn_1 + cn_2 + cn_3) % 1000000007; 131 | an = (an_1 + an_2 + an_3 + cn + cn_1 + cn_2) % 1000000007; 132 | an_3 = an_2; 133 | cn_3 = cn_2; 134 | an_2 = an_1; 135 | cn_2 = cn_1; 136 | an_1 = an; 137 | cn_1 = cn; 138 | } 139 | return an; 140 | }; 141 | 142 | ``` 143 | 144 | #### c#答案 145 | 146 | ```c# 147 | 148 | -------------------------------------------------------------------------------- /problem/553.最优除法.md: -------------------------------------------------------------------------------- 1 | ### 553.最优除法 2 | 3 | #### 1.题目描述 4 | 5 |

给定一组正整数,相邻的整数之间将会进行浮点除法操作。例如, [2,3,4] -> 2 / 3 / 4 。


但是,你可以在任意位置添加任意数目的括号,来改变算数的优先级。你需要找出怎么添加括号,才能得到最大的结果,并且返回相应的字符串格式的表达式。你的表达式不应该含有冗余的括号。


示例:



输入: [1000,100,10,2]
输出: "1000/(100/10/2)"
解释:
1000/(100/10/2) = 1000/((100/10)/2) = 200
但是,以下加粗的括号 "1000/((100/10)/2)" 是冗余的,
因为他们并不影响操作的优先级,所以你需要返回 "1000/(100/10/2)"。
其他用例:
1000/(100/10)/2 = 50
1000/(100/(10/2)) = 50
1000/100/10/2 = 0.5
1000/100/(10/2) = 2

说明:



  1. 输入数组的长度在 [1, 10] 之间。

  2. 数组中每个元素的大小都在 [2, 1000] 之间。

  3. 每个测试用例只有一个最优除法解。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/554.砖墙.md: -------------------------------------------------------------------------------- 1 | ### 554.砖墙 2 | 3 | #### 1.题目描述 4 | 5 |

你的面前有一堵方形的、由多行砖块组成的砖墙。 这些砖块高度相同但是宽度不同。你现在要画一条自顶向下的、穿过最少砖块的垂线。


砖墙由行的列表表示。 每一行都是一个代表从左至右每块砖的宽度的整数列表。


如果你画的线只是从砖块的边缘经过,就不算穿过这块砖。你需要找出怎样画才能使这条线穿过的砖块数量最少,并且返回穿过的砖块数量。


你不能沿着墙的两个垂直边缘之一画线,这样显然是没有穿过一块砖的。


 


示例:


输入: 
[[1,2,2,1],
[3,1,2],
[1,3,2],
[2,4],
[3,1,2],
[1,3,1,1]]
输出: 2
解释:


 


提示:



  1. 每一行砖块的宽度之和应该相等,并且不能超过 INT_MAX。

  2. 每一行砖块的数量在 [1,10,000] 范围内, 墙的高度在 [1,10,000] 范围内, 总的砖块数量不超过 20,000。


 


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/556.下一个更大元素 III.md: -------------------------------------------------------------------------------- 1 | ### 556.下一个更大元素 III 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个32位正整数 n,你需要找到最小的32位整数,其与 中存在的位数完全相同,并且其值大于n。如果不存在这样的32位整数,则返回-1。


示例 1:



输入: 12
输出: 21

示例 2:



输入: 21
输出: -1

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/558.四叉树交集.md: -------------------------------------------------------------------------------- 1 | ### 558.四叉树交集 2 | 3 | #### 1.题目描述 4 | 5 |

四叉树是一种树数据,其中每个结点恰好有四个子结点:topLefttopRightbottomLeft 和 bottomRight。四叉树通常被用来划分一个二维空间,递归地将其细分为四个象限或区域。


我们希望在四叉树中存储 True/False 信息。四叉树用来表示 N * N 的布尔网格。对于每个结点, 它将被等分成四个孩子结点直到这个区域内的值都是相同的。每个节点都有另外两个布尔属性:isLeaf 和 isLeaf。当这个节点是一个叶子结点时 isLeaf 为真。val 变量储存叶子结点所代表的区域的值。


例如,下面是两个四叉树 A 和 B:


A:
+-------+-------+ T: true
| | | F: false
| T | T |
| | |
+-------+-------+
| | |
| F | F |
| | |
+-------+-------+
topLeft: T
topRight: T
bottomLeft: F
bottomRight: F
B:
+-------+---+---+
| | F | F |
| T +---+---+
| | T | T |
+-------+---+---+
| | |
| T | F |
| | |
+-------+-------+
topLeft: T
topRight:
topLeft: F
topRight: F
bottomLeft: T
bottomRight: T
bottomLeft: T
bottomRight: F

 


你的任务是实现一个函数,该函数根据两个四叉树返回表示这两个四叉树的逻辑或(或并)的四叉树。


A:                 B:                 C (A or B):
+-------+-------+ +-------+---+---+ +-------+-------+
| | | | | F | F | | | |
| T | T | | T +---+---+ | T | T |
| | | | | T | T | | | |
+-------+-------+ +-------+---+---+ +-------+-------+
| | | | | | | | |
| F | F | | T | F | | T | F |
| | | | | | | | |
+-------+-------+ +-------+-------+ +-------+-------+

 


提示:



  1. A 和 B 都表示大小为 N * N 的网格。

  2. N 将确保是 2 的整次幂。

  3. 如果你想了解更多关于四叉树的知识,你可以参考这个 wiki 页面。

  4. 逻辑或的定义如下:如果 A 为 True ,或者 B 为 True ,或者 A 和 B 都为 True,则 "A 或 B" 为 True。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/559.N叉树的最大深度.md: -------------------------------------------------------------------------------- 1 | ### 559.N叉树的最大深度 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个N叉树,找到其最大深度。


最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。


例如,给定一个 3叉树 :



 


我们应返回其最大深度,3。


说明:



  1. 树的深度不会超过 1000

  2. 树的节点总不会超过 5000


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/560.和为K的子数组.md: -------------------------------------------------------------------------------- 1 | ### 560.和为K的子数组 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数数组和一个整数 k,你需要找到该数组中和为 的连续的子数组的个数。


示例 1 :



输入:nums = [1,1,1], k = 2
输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。

说明 :



  1. 数组的长度为 [1, 20,000]。

  2. 数组中元素的范围是 [-1000, 1000] ,且整数 的范围是 [-1e7, 1e7]。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/561.数组拆分 I.md: -------------------------------------------------------------------------------- 1 | ### 561.数组拆分 I 2 | 3 | #### 1.题目描述 4 | 5 |

给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。


示例 1:



输入: [1,4,3,2]
输出: 4
解释: n 等于 2, 最大总和为 4 = min(1, 2) + min(3, 4).

提示:



  1. n 是正整数,范围在 [1, 10000].

  2. 数组中的元素范围在 [-10000, 10000].


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/563.二叉树的坡度.md: -------------------------------------------------------------------------------- 1 | ### 563.二叉树的坡度 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个二叉树,计算整个树的坡度。


一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。


整个树的坡度就是其所有节点的坡度之和。


示例:



输入:
1
/ \
2 3
输出: 1
解释:
结点的坡度 2 : 0
结点的坡度 3 : 0
结点的坡度 1 : |2-3| = 1
树的坡度 : 0 + 0 + 1 = 1

注意:



  1. 任何子树的结点的和不会超过32位整数的范围。

  2. 坡度的值不会超过32位整数的范围。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/564.寻找最近的回文数.md: -------------------------------------------------------------------------------- 1 | ### 564.寻找最近的回文数 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数 n ,你需要找到与它最近的回文数(不包括自身)。


“最近的”定义为两个整数差的绝对值最小。


示例 1:



输入: "123"
输出: "121"

注意:



  1. n 是由字符串表示的正整数,其长度不超过18。

  2. 如果有多个结果,返回最小的那个。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/572.另一个树的子树.md: -------------------------------------------------------------------------------- 1 | ### 572.另一个树的子树 2 | 3 | #### 1.题目描述 4 | 5 |

给定两个非空二叉树 st,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。


示例 1:

给定的树 s:



3
/ \
4 5
/ \
1 2

给定的树 t:



4
/ \
1 2

返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。


示例 2:

给定的树 s:



3
/ \
4 5
/ \
1 2
/
0

给定的树 t:



4
/ \
1 2

返回 false


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/58.最后一个单词的长度.md: -------------------------------------------------------------------------------- 1 | ### 58.最后一个单词的长度 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。


如果不存在最后一个单词,请返回 0 。


说明:一个单词是指由字母组成,但不包含任何空格的字符串。


示例:


输入: "Hello World"
输出: 5

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int lengthOfLastWord(char* s) { 12 | int len=0; 13 | int i; 14 | int cnt=0; 15 | 16 | while(s[len] != '\0'){ 17 | len++; 18 | } 19 | 20 | i = len-1; 21 | while(s[i] == ' '){ 22 | i--; 23 | } 24 | 25 | while(s[i] != ' ' && i>=0){ 26 | cnt++; 27 | i--; 28 | } 29 | return cnt; 30 | } 31 | 32 | ``` 33 | 34 | #### c++答案 35 | 36 | ```c++ 37 | 38 | class Solution { 39 | public: 40 | int lengthOfLastWord(string s) { 41 | if(s.empty()) return 0; 42 | int res=0,l=s.size(); 43 | int left=0,right=l-1; 44 | while(s[left]==' ') left++; 45 | while(s[right]==' ') right--; 46 | for(int i=left;i<=right;i++){ 47 | if(s[i]==' ') {res=0; continue;} 48 | else res++; 49 | } 50 | 51 | return res; 52 | } 53 | }; 54 | 55 | ``` 56 | 57 | #### java答案 58 | 59 | ```java 60 | 61 | class Solution { 62 | public int lengthOfLastWord(String s) { 63 | if(s == null || s.trim().length() == 0) { 64 | return 0; 65 | } 66 | String[] sSplit = s.trim().split(" "); 67 | return(sSplit[sSplit.length - 1].length()); 68 | } 69 | } 70 | 71 | ``` 72 | 73 | #### JavaScript答案 74 | 75 | ```javascript 76 | 77 | /** 78 | * @param {string} s 79 | * @return {number} 80 | */ 81 | var lengthOfLastWord = function(s) { 82 | let strs = s.split(' ').reverse() 83 | strs = strs.filter(x => x.length) 84 | return strs[0] ? strs[0].length : 0 85 | }; 86 | 87 | ``` 88 | 89 | #### c#答案 90 | 91 | ```c# 92 | 93 | public class Solution { 94 | public int LengthOfLastWord(string s) { 95 | s=s.Trim(); 96 | var arr=s.Split(' '); 97 | return arr[arr.Length-1].Length; 98 | } 99 | } 100 | 101 | ``` 102 | 103 | #### python2.x答案 104 | 105 | ```python 106 | 107 | #encoding=utf-8 108 | import numpy as np 109 | 110 | 111 | class Solution(object): 112 | def lengthOfLastWord(self, s): 113 | """ 114 | :type s: str 115 | :rtype: int 116 | """ 117 | if s == '': 118 | return 0 119 | l = s.split() 120 | if len(l) == 0: 121 | return 0 122 | return len(l[-1]) 123 | 124 | 125 | ``` 126 | 127 | #### python3.x答案 128 | 129 | ```python 130 | 131 | class Solution: 132 | def lengthOfLastWord(self, s): 133 | """ 134 | :type s: str 135 | :rtype: int 136 | """ 137 | sl = len(s) 138 | isstart = False 139 | end = 0 140 | 141 | for i in range(sl): 142 | if not isstart and s[sl - 1 - i] != ' ': 143 | isstart = True 144 | end = sl - 1 - i 145 | if isstart and s[sl - 1 - i] == ' ': 146 | return end - (sl - 1 - i) 147 | if isstart: 148 | return end + 1 149 | else: 150 | return 0 151 | 152 | 153 | 154 | ``` 155 | 156 | #### go答案 157 | 158 | ```go 159 | 160 | func lengthOfLastWord(s string) int { 161 | l := 0 162 | for i:=len(s)-1; i>=0; i-- { 163 | if l == 0 && s[i] == ' ' { 164 | continue 165 | } 166 | if s[i] == ' ' { 167 | break 168 | } 169 | l++ 170 | } 171 | 172 | return l 173 | } 174 | 175 | ``` -------------------------------------------------------------------------------- /problem/581.最短无序连续子数组.md: -------------------------------------------------------------------------------- 1 | ### 581.最短无序连续子数组 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。


你找到的子数组应是最短的,请输出它的长度。


示例 1:



输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。

说明 :



  1. 输入的数组长度范围在 [1, 10,000]。

  2. 输入的数组可能包含重复元素 ,所以升序的意思是<=。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/583.两个字符串的删除操作.md: -------------------------------------------------------------------------------- 1 | ### 583.两个字符串的删除操作 2 | 3 | #### 1.题目描述 4 | 5 |

给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。


示例 1:



输入: "sea", "eat"
输出: 2
解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"

说明:



  1. 给定单词的长度不超过500。

  2. 给定单词中的字符只含有小写字母。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/587.安装栅栏.md: -------------------------------------------------------------------------------- 1 | ### 587.安装栅栏 2 | 3 | #### 1.题目描述 4 | 5 |

在一个二维的花园中,有一些用 (x,y) 坐标表示的树。由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树。只有当所有的树都被绳子包围时,花园才能围好栅栏。你需要找到正好位于栅栏边界上的树的坐标。


示例 1:



输入: [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]]
输出: [[1,1],[2,0],[4,2],[3,3],[2,4]]
解释:


示例 2:



输入: [[1,2],[2,2],[4,2]]
输出: [[1,2],[2,2],[4,2]]
解释:

即使树都在一条直线上,你也需要先用绳子包围它们。

注意:



  1. 所有的树应当被围在一起。你不能剪断绳子来包围树或者把树分成一组以上。

  2. 输入的整数在 0 到 100 之间。

  3. 花园至少有一棵树。

  4. 所有树的坐标都是不同的。

  5. 输入的点没有顺序。输出顺序也没有要求。


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/589.N叉树的前序遍历.md: -------------------------------------------------------------------------------- 1 | ### 589.N叉树的前序遍历 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个N叉树,返回其节点值的前序遍历


 


例如,给定一个 3叉树 :


 



 


返回其前序遍历: [1,3,5,6,2,4]


 


说明: 递归法很简单,你可以使用迭代法完成此题吗?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/590.N叉树的后序遍历.md: -------------------------------------------------------------------------------- 1 | ### 590.N叉树的后序遍历 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个N叉树,返回其节点值的后序遍历


 


例如,给定一个 3叉树 :


 



 


返回其后序遍历: [5,6,3,2,4,1].


 


说明: 递归法很简单,你可以使用迭代法完成此题吗?


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/591.标签验证器.md: -------------------------------------------------------------------------------- 1 | ### 591.标签验证器 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个表示代码片段的字符串,你需要实现一个验证器来解析这段代码,并返回它是否合法。合法的代码片段需要遵守以下的所有规则:



  1. 代码必须被合法的闭合标签包围。否则,代码是无效的。

  2. 闭合标签(不一定合法)要严格符合格式:<TAG_NAME>TAG_CONTENT</TAG_NAME>。其中,<TAG_NAME>是起始标签,</TAG_NAME>是结束标签。起始和结束标签中的 TAG_NAME 应当相同。当且仅当 TAG_NAME 和 TAG_CONTENT 都是合法的,闭合标签才是合法的

  3. 合法的 TAG_NAME 仅含有大写字母,长度在范围 [1,9] 之间。否则,该 TAG_NAME 是不合法的

  4. 合法的 TAG_CONTENT 可以包含其他合法的闭合标签cdata (请参考规则7)和任意字符(注意参考规则1)除了不匹配的<、不匹配的起始和结束标签、不匹配的或带有不合法 TAG_NAME 的闭合标签。否则,TAG_CONTENT 是不合法的

  5. 一个起始标签,如果没有具有相同 TAG_NAME 的结束标签与之匹配,是不合法的。反之亦然。不过,你也需要考虑标签嵌套的问题。

  6. 一个<,如果你找不到一个后续的>与之匹配,是不合法的。并且当你找到一个<</时,所有直到下一个>的前的字符,都应当被解析为 TAG_NAME(不一定合法)。

  7. cdata 有如下格式:<![CDATA[CDATA_CONTENT]]>CDATA_CONTENT 的范围被定义成 <![CDATA[ 和后续的第一个 ]]>之间的字符。

  8. CDATA_CONTENT 可以包含任意字符。cdata 的功能是阻止验证器解析CDATA_CONTENT,所以即使其中有一些字符可以被解析为标签(无论合法还是不合法),也应该将它们视为常规字符


合法代码的例子:



输入: "<DIV>This is the first line <![CDATA[<div>]]></DIV>"
输出: True
解释:
代码被包含在了闭合的标签内: <DIV> 和 </DIV> 。
TAG_NAME 是合法的,TAG_CONTENT 包含了一些字符和 cdata 。
即使 CDATA_CONTENT 含有不匹配的起始标签和不合法的 TAG_NAME,它应该被视为普通的文本,而不是标签。
所以 TAG_CONTENT 是合法的,因此代码是合法的。最终返回True。

输入: "<DIV>>> ![cdata[]] <![CDATA[<div>]>]]>]]>>]</DIV>"
输出: True
解释:
我们首先将代码分割为: start_tag|tag_content|end_tag 。
start_tag -> "<DIV>"
end_tag -> "</DIV>"
tag_content 也可被分割为: text1|cdata|text2 。
text1 -> ">> ![cdata[]] "
cdata -> "<![CDATA[<div>]>]]>" ,其中 CDATA_CONTENT 为 "<div>]>"
text2 -> "]]>>]"

start_tag "<DIV>>>" 的原因参照规则 6 。
cdata "<![CDATA[<div>]>]]>]]>" 的原因参照规则 7 。

不合法代码的例子:



输入: "<A> <B> </A> </B>"
输出: False
解释: 不合法。如果 "<A>" 是闭合的,那么 "<B>" 一定是不匹配的,反之亦然。
输入: "<DIV> div tag is not closed <DIV>"
输出: False
输入: "<DIV> unmatched < </DIV>"
输出: False
输入: "<DIV> closed tags with invalid tag name <b>123</b> </DIV>"
输出: False
输入: "<DIV> unmatched tags with invalid tag name </1234567890> and <CDATA[[]]> </DIV>"
输出: False
输入: "<DIV> unmatched start tag <B> and unmatched end tag </C> </DIV>"
输出: False

注意:



  1. 为简明起见,你可以假设输入的代码(包括提到的任意字符)只包含数字, 字母, '<','>','/','!','[',']'' '


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | -------------------------------------------------------------------------------- /problem/600.不含连续1的非负整数.md: -------------------------------------------------------------------------------- 1 | ### 600.不含连续1的非负整数 2 | 3 | #### 1.题目描述 4 | 5 |

给定一个正整数 n,找出小于或等于 n 的非负整数中,其二进制表示不包含 连续的1 的个数。


示例 1:


输入: 5
输出: 5
解释:
下面是带有相应二进制表示的非负整数<= 5:
0 : 0
1 : 1
2 : 10
3 : 11
4 : 100
5 : 101
其中,只有整数3违反规则(有两个连续的1),其他5个满足规则。

说明: 1 <= n <= 109


6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int findIntegers(int num) { 12 | static int fb[31] = { 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946,17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578 }; 13 | if (num < 3) 14 | return num + 1; 15 | for (int bt = 29; bt >= 0; --bt) // bt should start from 30, but OJ accepts it from 29. 16 | if (num & (1 << bt)) 17 | return num & (1 << (bt - 1)) ? fb[bt] : fb[bt - 1] + findIntegers((num & ~(1 << bt))); 18 | return 0; 19 | } 20 | 21 | 22 | 23 | 24 | ``` 25 | 26 | #### c++答案 27 | 28 | ```c++ 29 | 30 | class Solution { 31 | public: 32 | int findIntegers(int num) { 33 | if(num<2) 34 | return num+1; 35 | int f[30]; 36 | f[0]=1; 37 | f[1]=2; 38 | for(int i=2;i<30;i++) 39 | { 40 | f[i]=f[i-1]+f[i-2]; 41 | } 42 | int ans=0; 43 | for(int i=29;i>=0;i--) 44 | { 45 | if((num>>i)&1) 46 | { 47 | ans+=f[i]; 48 | if(num>>(i+1)&1) 49 | { 50 | return ans; 51 | } 52 | } 53 | } 54 | return ans+1; 55 | } 56 | }; 57 | 58 | ``` 59 | 60 | #### java答案 61 | 62 | ```java 63 | 64 | class Solution { 65 | public int findIntegers(int num) { 66 | int[] buf = new int[31]; 67 | buf[0] = 1; 68 | buf[1] = 2; 69 | for (int i = 2; i < buf.length; i++) { 70 | buf[i] = buf[i - 2] + buf[i - 1]; 71 | } 72 | int a, b; 73 | a = num; 74 | String nums = ""; 75 | while (a > 0) { 76 | nums = a % 2 + nums; 77 | a /= 2; 78 | } 79 | int pre = 0; 80 | int result = 0; 81 | 82 | while (nums.length()>0){ 83 | if (nums.charAt(0) == '1'){ 84 | result+=buf[nums.length()-1]; 85 | if (pre==1) return result; 86 | pre = 1; 87 | } 88 | else pre = 0 ; 89 | nums = nums.substring(1); 90 | } 91 | return result+1; 92 | } 93 | } 94 | 95 | ``` 96 | 97 | #### JavaScript答案 98 | 99 | ```javascript 100 | 101 | /** 102 | * @param {number} num 103 | * @return {number} 104 | */ 105 | var findIntegers = function(num) { 106 | let num0 = 1 107 | let num1 = 2 108 | 109 | if (num === 1) { 110 | num1 = num 111 | } 112 | let num2 = num.toString(2) 113 | let length = num2.length 114 | for (let i = 2; i < length; i++) { 115 | let temp = num0 + num1 116 | num0 = num1 117 | num1 = temp 118 | } 119 | 120 | num2 = num2.slice(1) 121 | if (num2[0] === '1') { 122 | return findIntegers(Math.pow(2, length)) - 1 123 | } 124 | let index = num2.indexOf('1') 125 | if (index !== -1) { 126 | num2 = num2.slice(index) 127 | num1 += findIntegers(parseInt(num2, 2)) - 1 128 | } 129 | return ++num1 130 | }; 131 | 132 | ``` 133 | 134 | #### c#答案 135 | 136 | ```c# 137 | 138 | -------------------------------------------------------------------------------- /problem/70.爬楼梯.md: -------------------------------------------------------------------------------- 1 | ### 70.爬楼梯 2 | 3 | #### 1.题目描述 4 | 5 |

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。


每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?


注意:给定 n 是一个正整数。


示例 1:


输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶

示例 2:


输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

6 | 7 | #### c答案 8 | 9 | ```c 10 | 11 | int climbStairs(int n) { 12 | if(n==1)return 1; 13 | if(n==2)return 2; 14 | int t1=1,t2=2; 15 | int tmp; 16 | for(int i=3;i<=n;i++) 17 | { 18 | tmp=t1+t2; 19 | t1=t2; 20 | t2=tmp; 21 | } 22 | return t2; 23 | } 24 | 25 | ``` 26 | 27 | #### c++答案 28 | 29 | ```c++ 30 | 31 | class Solution { 32 | public: 33 | int climbStairs(int n) { 34 | int len1 = n/2; 35 | if (n == 0) return 0; 36 | if (n == 1) return 1; 37 | if (n == 2) return 2; 38 | if (n == 3) return 3; 39 | return climbStairs(len1) * climbStairs(n - len1) + climbStairs(len1 - 1) * climbStairs(n - len1 - 1); 40 | } 41 | }; 42 | 43 | ``` 44 | 45 | #### java答案 46 | 47 | ```java 48 | 49 | class Solution { 50 | public int climbStairs(int n) { 51 | if(n==2) 52 | return 2; 53 | if(n==1) 54 | return 1; 55 | Stack s = new Stack(); 56 | s.push(1); 57 | s.push(2); 58 | int tmp,t; 59 | for(int i=2;i