目录
[toc]
1 两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
我的做法如下,直接暴力,复杂度是O(n2),我们试图通过遍历数组的其余部分来寻找它对应的目标,这将耗费O(n)*O(n)的时间。
也可以使用哈希表
优化版的哈希表如下:
2 两数相加(链表)(回到目录)
给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。
例如:
我一开始的做法:错的!
参考做法
3 无重复字符的最长子串(回到目录)
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
|
|
更简便的方法,维护一个窗口
4 两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
你可以假设 nums1 和 nums2 均不为空。
示例 1:
示例 2:
|
|
5 最长回文子串(回到目录)
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
示例 2:
|
|
6 Z字形变换(回到目录)
将字符串 “PAYPALISHIRING” 以Z字形排列成给定的行数:
|
|
7 反转整数
给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
示例 2:
示例 3:
|
|
8 字符串转整数 (atoi)(回到目录)
实现 atoi,将字符串转为整数。
在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
|
|
9 回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
|
|
10. 正则表达式匹配(回到目录)
给定一个字符串 (s) 和一个字符模式 (p)。实现支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符。
‘*’ 匹配零个或多个前面的元素。
匹配应该覆盖整个字符串 (s) ,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
|
|
11 盛水(回到目录)
LINK
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
我的做法是错的,以为只需要找到最大的两个数,其实不是!还需要考虑index的距离。
还有一种做法,不知道哪里错了。(后来发现是temp的地方放错了!!!)
下面的这个方法可以ac:
12 整数转换成罗马数字(回到目录)
我的做法如下:
参考做法
13 罗马数字转换城整数(回到目录)
|
|
15 三数之和(回到目录)
链接:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意: 答案中不可以包含重复的三元组。
|
|
启发于4数之和的做法,有以下的代码:
16 最接近的三数之和
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2(-1 + 2 + 1 = 2).
可以通过的做法之一,使用左右指针往中间夹逼。
17 电话号码的字母组合(回到目录)
定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1:
不对应任何字母。
示例:
|
|
==大坑==:
实际上这行代码是省略了的,因为对于一个字符串来说,结束符是‘\0’,index加到最后面递归函数自然会return,所以可以不用return。我一开始,是直接在res.push_back(local);
的下一行加return,那肯定是错的。因为index还没大于digits.size,就不能return.
18 四数之和(回到目录)
|
|
19 删除倒数第N个节点(回到目录)
我一开始的做法
21 合并两个有序链表(回到目录)
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
|
|
20 有效的括号(回到目录)
给定一个只包括 '(',')','{','}','[',']'
的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
23 合并K个有序链表(回到目录)
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
方法1:分治归并
方法2: 将所有的节点放在一个vector,然后再排序,最后相连。
24 两两交换链表中相邻的节点(回到目录)
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
26 删除排序数组中的重复项(82,83)(回到目录)
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
示例 2:
你不需要考虑数组中超出新长度后面的元素。
方法1
方法2(我更倾向)
快慢指针:同方法2
80 删除排序数组中的重复项 II(回到目录)
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
|
|
31 下一个排列(回到目录)
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
32 最长有效括号(回到目录)
给定一个只包含 ‘(‘ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
使用栈
33 搜索旋转排序数组
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
|
|
二分查找
这道题让在旋转数组中搜索一个给定值,若存在返回坐标,若不存在返回-1。我们还是考虑二分搜索法,但是这道题的难点在于我们不知道原数组在哪旋转了,我们还是用题目中给的例子来分析,对于数组[0 1 2 4 5 6 7] 共有下列七种旋转方法:
二分搜索法的关键在于获得了中间数后,判断下面要搜索左半段还是右半段,我们观察上面红色的数字都是升序的,由此我们可以观察出规律,如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了,代码如下:
34 在排序数组中查找元素的第一个和最后一个位置(回到目录)
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
|
|
二分查找法:
使用两次二分查找法,第一次找到左边界,第二次调用找到右边界即可
35 搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
视频上解法
其他解法1
其他解法2:二分查找法
39 组合总和 I
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:
示例 2:
|
|
40 组合总和 II(回到目录)
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
示例 1:
示例 2:
方法1
另一种做法:使用set容器,代码和上面那题一样的
45 跳跃游戏 II
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
|
|
46 全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
|
|
注:我们来仔细推敲一下循环体里的代码,当我们对序列进行交换之后,就将交换后的序列除去第一个元素放入到下一次递归中去了,递归完成了再进行下一次循环。这是某一次循环程序所做的工作,这里有一个问题,那就是在进入到下一次循环时,序列是被改变了。可是,如果我们要假定第一位的所有可能性的话,那么,就必须是在建立在这些序列的初始状态一致的情况下,所以每次交换后,要还原,确保初始状态一致。
47 全排列II(回到目录)
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
|
|
48 旋转图像(回到目录)
给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度。
说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。
代码
49 字母异位词分组
给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。
示例:
说明:
所有输入均为小写字母。
不考虑答案输出的顺序。
|
|
另一种更为巧妙地方法:使用哈希
51 N皇后(回到目录)
|
|
53 最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
动态规划
常规方法
55 跳跃游戏(回到目录)
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个位置。
示例 1:
示例 2:
代码
另一个好的解法
61 旋转链表(回到目录)
给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。
代码
64 最小路径和
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
代码1:
代码2:
66 加一(回到目录)
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
67 二进制求和(回到目录)
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
示例 2:
|
|
69 x 的平方根(回到目录)
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
解法1
解法2
70 爬楼梯答(回到目录)
假设你正在爬楼梯。需要 n 步你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
|
|
76 最小覆盖子串
给定一个字符串 S 和一个字符串 T,请在 S 中找出包含 T 所有字母的最小子串。
示例:
说明:
如果 S 中不存这样的子串,则返回空字符串 “”。
如果 S 中存在这样的子串,我们保证它是唯一的答案。
77 组合(回到目录)
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
递归回溯
78 子集(回到目录)
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
小象写法
for循环里递归
90 子集 II(回到目录)
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
小象解法:
for循环里面递归
82 删除排序链表中的重复元素II(回到目录)
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
示例 2:
新建链表头结点指针pDel,pDel->next=head
,并设置指针prev
指针指向pDel
,curr
指针指向head->next
(代表遍历指针);当curr->next
不为NULL
,如果curr->next->val == curr->val,curr=curr->next
;如果curr->next->val != curr->val
;则需判断prev->next=curr
?如果是,则prev=curr
;如果不是,则prev->next=curr->next
.(这里是说,prev
先假设一个next
指针,即curr=curr->next
;当进行下一步判断时,如果curr->next->val != curr->val
且 prev->next==curr
,则说明假设正确,prev直接指向curr)
83 删除排序链表中的重复元素(回到目录)
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例1:
|
|
示例2:
代码
86 分割链表(回到目录)
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。
你应当保留两个分区中每个节点的初始相对位置。
示例:
|
|
88 合并有序数组
给定两个有序整数数组nums1
和 nums2
,将nums2
合并到nums1
中,使得num1
成为一个有序数组。
说明:
初始化 nums1
和 nums2
的元素数量分别为m
和n
。
你可以假设nums1
有足够的空间(空间大小大于或等于 m + n
)来保存nums2
中的元素。
示例:
|
|
92 反转链表II(回到目录)
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:1 ≤ m ≤ n ≤ 链表长度
。
示例:
|
|
94 二叉树的中序遍历(144,145)(回到目录)
递归方法
迭代方法
101 对称二叉树(回到目录)
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树[1,2,2,3,4,4,3]
是对称的。
代码
102 二叉树的层次遍历
非递归
分析:先建立一个queue,然后先把根节点放进去,这时候找根节点的左右两个子节点,这时候去掉根节点,此时queue里的元素就是下一层的所有节点,用一个for循环遍历它们,然后存到一个一维向量里,遍历完之后再把这个一维向量存到二维向量里,以此类推,可以完成层序遍历。代码如下:
递归做法
104 二叉树的最大深度(递归)
深度优先
宽度优先
111 二叉树的最小深度(回到目录)
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
|
|
108 将有序数组转换为二叉搜索树(回到目录)
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
代码
109 有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
使用了递归,和那个24题差不多,关键是如何找到链表的中间位置。
110 平衡二叉树(回到目录)
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
示例 2:
代码
112 路径之和(二叉树)(回到目录)
给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。
说明: 叶子节点是指没有子节点的节点。
118 杨辉三角
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
119 杨辉三角II(回到目录)
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
示例:
|
|
125 验证回文串(回到目录)
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
|
|
121 买卖股票的最佳时机(回到目录)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
示例 1:
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
134 加油站
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。
示例 1:
贪心相关:
135 分发糖果(回到目录)
老师想给孩子们分发糖果,有 N个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。
你需要按照以下要求,帮助老师给这些孩子分发糖果:
每个孩子至少分配到 1 个糖果。
相邻的孩子中,评分高的孩子必须获得更多的糖果。
那么这样下来,老师至少需要准备多少颗糖果呢?
示例 1:
示例 2:
思路:
假设每个孩子分到的糖果数组为A[N]
,初始化为{1},因为每个人至少分到一颗糖。
1、与前面的邻居比较,前向遍历权重数组ratings,如果ratings[i]>ratings[i-1],则A[i]=A[i-1]+1
;
2、与后面的邻居比较,后向遍历权重数组ratings,如果ratings[i]>ratings[i+1]且A[i]<A[i+1]+1
,则更新A
,A[i]=A[i+1]+1
;
3、对A求和即为最少需要的糖果。
时间复杂度:O(n)
空间复杂度:O(n)
|
|
136 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
我的做法
按位异或
用到位运算之异或的特性:n ^ n = 0, 0 ^ x = x。
137 只出现一次的数字II(回到目录)
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
我的做法
位运算
141 环形链表(回到目录)
给定一个链表,判断链表中是否有环。
方法1
方法2
142 环形链表II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
说明:不允许修改给定的链表。
144 二叉树的前序遍历
题目描述提示帮助提交记录社区讨论阅读解答
给定一个二叉树,返回它的 前序 遍历。
示例:
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
递归方法
迭代方法
145 二叉树的后序遍历
递归方法
递归1
递归2
迭代法
160 求两个链表的交点。(回到目录)
已知链表A的头节点指针headA,链表B的头节点指针headB,两个链表相交,求两个链表交点对应的节点。
方法一:使用std中的set函数
方法二
169 求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
示例 1:
示例 2:
|
|
189 旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
示例 2:
我的做法
191 位1的个数
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
示例 :
示例 2:
|
|
法2:位运算
199 二叉树的右视图(回到目录)
递归做法
普通方法
206 反转链表(回到目录)
反转一个单链表。
示例:
|
|
215 数组中的第k个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
|
|
225 用队列实现栈
|
|
226 翻转二叉树(回到目录)
使用递归方法
非递归
258 各位相加(回到目录)
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
递归方法
循环方法
295 数据流的中位数(回到目录)
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如:
示例:
|
|
315 计算右侧小于当前元素的个数(回到目录)
给定一个整数数组 nums,按要求返回一个新数组 counts。数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量。
示例:
|
|
389 找不同
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例:
|
|
402 移掉k个数字(回到目录)
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
示例 1 :
示例 2 :
示例 3 :
|
|
414 第三大的数
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
|
|
520 检测大写字母(回到目录)
给定一个单词,你需要判断单词的大写使用是否正确。
我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如”USA”。
单词中所有字母都不是大写,比如”leetcode”。
如果单词不只含有一个字母,只有首字母大写, 比如 “Google”。
否则,我们定义这个单词没有正确使用大写字母。
注意: 输入是由大写和小写拉丁字母组成的非空单词。
633 平方数之和
给定一个非负整数c,你要判断是否存在两个整数a和b,使得$a^{2}+b^{2}=c$
我的做法如下:
下面这种方法用到了集合set,从0遍历到c的平方根,对于每个i*i
,都加入集合set中,然后计算c-i*i
,如果这个差值也在集合set中,返回true,遍历结束返回false,参见代码如下:
784 字母大小写全排列(回到目录)
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
|
|
或者: