LeetCode算法题思路总结
No.724. 寻找数组的中心索引
中心索引: 数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和
思路:转化为求解 sunLeft * 2 + nums[p] = sumTotal
No.747. 至少是其他数字两倍的最大数
在一个给定的数组nums中,总是存在一个最大元素 。
查找数组中的最大元素是否至少是数组中每个其他数字的两倍。
思路:转化为数组中的最大元素是否至少是第二大元素的两倍。一轮循环得到最大元素和第二大元素,再进行判断。
No.18 加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
思路:分情况讨论:1,当末尾数字不为9时,末尾数字+1,return。
2,当末尾数字为9时,末尾数字清0,前一位+1,若前一位还是进位,则继续循环,若没有进位则return。如果直到循环结束还没return,说明该数为9,99,999,9999等等,此时需手动进一位。
No.189 旋转数组
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
思路:第i位的下一个坐标是(i+k)%nums.length 。因此可使用一个临时数组,把原本数组里下标为 i的数值放到 临时数组下标为(i+k)%nums.length 的位置,再把新数组拷贝到原数组中。
No.561 拆分数组I
给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。
思路:配对的两个数越接近,总和越大。所以给数组的元素进行排序,并直接按排序顺序形成元素的配对。
No.88. 合并两个有序数组
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。
思路:把nums2的元素放进num1数组里面,在进行排序Arrays.sort(nums1)即可
No.498. 对角线遍历
给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出: [1,2,4,7,5,3,6,8,9]
思路:这题的切入点是找规律:
1,up->down->up->down直到超出边界
2,up的操作:i–,j++直到超过边界
3,down的操作:j–,i++直到超过边界
4,up->down up的最后一个元素到down的第一个元素改变方式:
先让i不变,j+1,如果超过边界,则让i+1,j不变,然后将up状态->down状态
5,down->up down的最后一个元素到up的第一个元素改变方式:
先让i+1,j不变,如果超过边界,则让j+1,i不变,然后将down状态->up状态
No.? 从排序数组中删除重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4],
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
注意重点:排序数组,不需要考虑数组中超出新长度后面的元素,不要使用额外的数组空间,原地删除重复出现的元素。
思路:使用双指针,一个指针a指向新数组的下标,一个指针b遍历原数组,当两者的值不相等时,把nums[b]赋值给nums[++a],最后a+1就是新数组的长度了。
No.13 罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
示例 1:
输入: “III”
输出: 3
示例 2:
输入: “IV”
输出: 4
示例 3:
输入: “IX”
输出: 9
示例 4:
输入: “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
思路
首先将所有的组合可能性列出并添加到哈希表中
然后对字符串进行遍历,由于组合只有两种,一种是 1 个字符,一种是 2 个字符,其中 2 个字符优先于 1 个字符
先判断两个字符的组合在哈希表中是否存在,存在则将值取出加到结果 ans 中,并向后移2个字符。不存在则将判断当前 1 个字符是否存在,存在则将值取出加到结果 ans 中,并向后移 1 个字符
遍历结束返回结果 ans
No.12 整数转罗马数字
思路:两个数组降序存放罗马数字符号的值及表达式