提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
进入代码随想录的第一天,希望能够坚持下来,除了任务之外,每天刷两三道新题。之前是用IDEA刷的,有一些自动补全功能,现在直接在leetcode平台上刷题,提高对函数的熟练度。
提示:以下是本篇文章正文内容,下面案例可供参考
一、704. 二分查找
- 二分法是针对于有序数组的
- mid溢出问题
int mid = (left+right)/2;//?
如果left+right大于int型的上限,就会产生溢出问题
所以写成mid=left+(right-left)/2;或mid=left+(right-left)>>1;
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while(left<=right){
// int mid = (left+right)/2;//?
int mid=left+(right-left)/2;
if (target>nums[mid]){
left++;
} else if (target<nums[mid]){
right--;
} else{
return mid;
}
}
return -1;
}
用时6分钟
二、27. 移除元素
双指针法:通过两个指针在一个for循环中,完成两个for循环的作用
在for循环里的逻辑上卡了一些时间。判断,值如果不相等,那么他就是这个数组中的元素。
容易混的点:
- slow指针先移位后赋值还是先赋值后移位。
- 判断的是值相等还是值不相等。
public int removeElement(int[] nums, int val) {
//双指针
int slow = 0;
// int fast = 0;
for(int fast=0;fast<nums.length;fast++){
if(nums[fast]!=val){//?
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
用时9分钟
三、剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
双指针法:慢指针
指向更新 新数组下标的位置,快指针
是找奇元素。
简单说,就是快指针找到了奇元素,就和慢指针的元素互换位置。
一些自己想的问题:
代码只是保证了奇数在偶数前面,但顺序不是原数组的顺序
比如:输入[1,2,3,4,6,7,8,10,11],输出:[1,3,7,11,6,2,8,10,4],6跑2前了。
会把奇数换到后面吗?不会
慢指针都是指向偶数才换的吗?对的,如果是奇数的话,快指针早就换了
有点想多了,其实只用考虑我把遇到的奇数都换到前面去,别的不用考虑。
public int[] exchange(int[] nums) {
int slow = 0;//存放元素
// int fast = 0;//找到奇数
for(int fast=0;fast<nums.length;fast++){
// System.out.println(fast);
if (nums[fast]%2==1){
int temp = nums[slow];
nums[slow] = nums[fast];
nums[fast] = temp;
slow++;
}
}
return nums;
}
46分钟,和上面题很像,时间久了
总结
多加练习,勤于思考