《JDFrame》《FastRetry》《UniHttp》作者
获得徽章 17
859. 亲密字符串
思路:
有两种情况
1、A == B时
这时只要A包含重复元素,那A的重复元素交换后肯定也与B相等
2、A != B 时
计算A与B相同的位置索引下不相等的元素个数, 如果个数不等与2,A无论怎么交换一次都不可能等于B, 如果个数为2,判断交换后是否相等即可
面试题 01.06. 字符串压缩
思路[O(N)]
cur指向当前要压缩的元素, count维护cur重复的次数, 扫一遍s, 当arr[i]与cur不相等时,更换要压缩的元素cur的指向同时拼接答案ret, 然后重复执行处理. 最后遍历s后, 还有最后一个cur没有拼接答案ret, 手动拼接.
1535.找出数组游戏的赢家
思路1: 直接模拟游戏过程(见图2)
思路2:
1、省去游戏规则中移至数组的末尾的操作, 把集合看成3个区域即, [ 守擂台者 ,待攻擂台的选手们 , 淘汰区 ], 然后守擂台者不断和待攻擂台的选手们比赛,胜利的作为守擂台者, 如果守擂台者连胜次数等于k ,则结束比赛.
2、并不是真的要比K轮, 因为比完一轮后,留在台上的一定是最强守擂台者(即最大值),所以后面不用比都知道获胜者是它, 所以一轮之后或者还没到达一轮之前就赢了k场都可以结束比赛了
73.矩阵置零
思路:
扫一遍matrix,找出在matrix中不存在的数x作为标记, 在需要置为0的元素的过程中先不置为0而是将其打标记成x,最后扫一遍matrix将有标识位x的元素真正置为0
55. 跳跃游戏
思路[O(N)]:
扫一遍nums, 实时维护位置0 当前可到达的最大距离max_distance,
如果当前元素 i 处于 max_distance范围 之内, 计算当前位置i可到达的最大距离(即i + nums[i])是否大于max_distance, 如果是更新max_distance
最终判断max_distance是否大于nums.length - 1即可知道是否能到达最后一个位置.
581. 最短无序连续子数组
思路:
1、整体上看, 原始区间由三部分组成, 左有序区间, 无序区间, 右有序区间,并且满足无序区间的最小值大于左有序区间的最大值, 并且无序区间的最大值小于右有序区间的最小值, 所以关键是找到无序区间的左右边界.
2、如何寻找无序区间的左右边界?
从左到右扫一边, 求出以0为起始点的最大的无序区间[0, r],
同理, 然后从右扫一遍,求出以nums.length - 1为结束点的最大的无序区间[l,nums.length -1]
所以题目所求的最短无序区间就是这两个区间的交集, 即[l, r], 所以长度就是 r - l + 1.
16.06.最小差
思路:
双指针分别指向 a 和 b即可, 循环计算绝对值, 当a[i] > b[j]时,改变j,寻找可能更小的绝对值差, 当 a[i] < b[j] 同理
849.到最近的人的最大距离
思路1:
设置两个状态函数:
left[i] = 表示座位 i 到坐在 i 左边的人的最近距离
right[i] = 表示座位 i 到坐在 i 右边的人的最近距离
所以min(left[i], right[i]), 就表示座位i离人的最近距离
然后分别递推计算left[i] 和 right[i]
然后只需要枚举每一个空座位i, 得出每个空座位i离人的最近距离然后从中取最大值
思路2:
存储每个人的座位, 然后计算两个人中间距离
1552.两球之间的磁力
思路:
假设position排序后, 合法的磁力值一定在[0,position[position.length -1 ] - position[0]] 的区间内. 所以只需要枚举这个区间的每一个可能的答案, 然后判断此时的答案是否合法的即可(就是判断此时的最小磁力值(间距)下能否放下所有的小球), 因为最小磁力一定在相邻的两个小球的位置间产生, 但是也不用每个都枚举, 可以把所有可能的磁力值进行一个排序,然后进行二分枚举
如果中间mid的磁力值不合法说明太大了就去左边找,如果能放下就去右边找, 最终找到的就是合法的磁力值的最大值了。
下一页