ARTS Week 21
Algorithm
本周的 LeetCode 题目为 33. 搜索旋转排序数组
整数数组 nums
按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums
在预先未知的某个下标 k
(0 <= k < nums.length
)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]
(下标从0 开始计数)。例如, [0,1,2,4,5,6,7]
在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]
。
给你 旋转后 的数组 nums
和一个整数 target
,如果 nums
中存在这个目标值 target
,则返回它的下标,否则返回 -1
。
输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
class Solution {
public int search(int[] nums, int target) {
if (nums.length == 1) {
if (nums[0] == target) {
return 0;
} else {
return -1;
}
}
int left = 0;
int right = nums.length - 1;
int ans = -1;
while (left < right) {
if (nums[left] == target) {
ans = left;
break;
}
if (nums[right] == target) {
ans = right;
break;
}
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
ans = mid;
break;
}
if (nums[mid] >= nums[0]) { // nums[0], NOT nums[mid]
if (target >= nums[0] && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else {
if (target > nums[mid] && target < nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
}
}
return ans;
}
}
Review
本周 Review 的英文文章为:我希望我早点儿知道的一些事情
作者在文中介绍了他自己常用的一些软件、工具等。下面是具体介绍:
- Anki:Anki 是一个免费的开源抽认卡程序,你可以利用它来帮你记住任何东西。
- Dextroamphetamine:是一种可以增强认知的兴奋剂
- R:R语言可以有效地组织和可视化数据
- sci-hub 和 Kindle、Z-Library、Calibre:sci-hub 可以免费获取到很多科学论文;Kindle 是阅读工具,你可以在 Z-Library 上找到很多想要的书,再通过 Calibre 来将这些书导入到 Kindle 中
- 保持良好的开放判断:你可以通过购买、阅读大量书籍,来使得你更加理性并减少偏见认知的影响。
Tip
为什么 printf
在调用后不会及时输出?因为在默认情况下,输出流 stdout
是有缓冲的,如果你想要立即输出,那么则需要刷新流(使用 fflush
)或在 printf
中打印换行符:
// Method 1:
printf("Starting nets allocation...");
fflush(stdout);
// Method 2:
printf("Starting nets allocation...\n");
Share
看了上面的 Review 中的介绍,打算去试一试 Anki
这个软件。