1.有序数组的二分查找
要点
(1) 为什么用 mid = first + (last - first)/ 2 代替 mid = (first + last )/ 2 ?
答:当查找至少有2^30 个元素的数组时,first + last 有可能超过 2^31 -1,而导致其变成负数,mid也变成负数,所以用mid = first + (last - first)/ 2代替,避免此问题产生。
(2) 代码模板
int start = 0, int last = nums.length - 1;
while(start + 1 < last ){
int mid = first + (last - first)/ 2;
if(...) start = mid;
else last = mid;
}
还有一种常用模板(不足点:要考虑清楚当数组为[1]时)
int start = 0, int last = nums.length - 1;
while(start <= last){
int mid = first + (last - first)/ 2;
if(nums[mid] <= target) start = mid + 1;
else last = mid - 1;
}
2.刷过的题
1021. 删除最外层的括号(Tag为栈)
此题并没有解出来。
思路:利用栈进行原语化分解,用substring函数进行删除,即取子字符串。
67. 二进制求和 (Tag为字符串)
此题也没有做出来,自己简直是铁five。
思路:既然是二进制求和,类比于十进制的加法,满2进1,如何进,用int carry 保存进位,carry = 和 / 2,余数即 和 % 2。还有一个知识点就是 **数字字符转换成数字,eg: '1' - '0' = 1
122.买卖股票的最佳时机 II(Tag为贪心)
还是没做出来。此题其实还是比较简单的。
思路:算出相邻两天间的利润,若为正则加在总利润上,若为负则不加。
1046. 最后一块石头的重量(Tag为贪心)
有了前一道题的铺垫,此次的贪心终于做出来了。
思路:排序,递归
1217. 玩筹码(Tag为贪心)
此题理解错了题目的意思,看了一下评论区的阅读理解,懂了题意后就写完了。
思路:数组的元素表示的是筹码放置的位置,如2,即一个筹码放在位置2.此题即是表达是奇数位置的筹码多还是偶数位置的筹码多,若奇数位置的多就返回偶数位置的筹码数,反之返回奇数位置的筹码数
贪心即是用局部最优代替全局最优。
3.分治与动态规划
还未做题,故还不知道其具体的应用方式。
4.其他
刷完了《钢之炼金术师》,很棒的一部老番。
还学了些啥忽然就记不得了。(— _ —)
明天开启《操作系统》与《计算机网络》的征途。