Leetcode:学习记录(二)
按照https://leetcode.cn/circle/discuss/RvFUtj/顺序刷题
零、经验记录
1. 学会画图分析
2. 学会找终止条件
3. 做一道就高质量完成
一、二分算法
0. 总结:大于某个数的第一个数的位置有固定模板,其中要讨论最后一个数小于等于目标数的情况
1. 二分查找:在升序数组中查找某数,如果存在则返回下标,不存在则返回-1
a. 自己的想法:left、mid、right三个指针迭代,注意终止条件,一是mid对应的元素为该数,二是到了只剩两个元素时,那么此时mid=left,如果right对应元素为该数,则返回下表right,如果不是,则代表数组中没有该数,返回-1
b. 存在的问题:判断条件复杂,原因是边界不好,每次判断完大小后,实际上mid对应的元素就可以被排除了。如果nums[mid] > target: right = mid-1。如果nums[mid]<target:left=mid+1。
c. 一点点的疏忽会带来极大的麻烦,要求逻辑足够严谨,充分利用已有信息。
2. 寻找比目标字母大的最小字母:找到一个非递减字符数组中比目标字母大的最小字母
a. 自己的想法:三指针迭代,迭代方式为: if letters[mid] <= target: left= mid+1; if letters[mid] > target: right = mid
b. 存在的问题:没考虑到字母之间可以直接比较(上面是改正后的),没有搞清终止条件。如下图,首先排除target不在该字符数组的两种情况,然后递推即可。
3. 正整数和负整数的最大计数:统计非递减数组的正整数数量和负整数数量中的最大值
a. 自己的想法:需要计算pos和neg的数量,首先如果第一个数大于0或者最后一个数小于0,那么该数组全正或全负,返回数组长度即可。然后分别找到大于0的第一个数的位置和小于0的最后一个数的位置。这里需要注意避免陷入死循环,需要考虑遍历尽头。
b.存在的问题:小于0的最后一个数容易陷入死循环,可以转换为大于等于-1的第一个数,然后这个数的前一个数就必然是最后一个负整数。