提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、283.移动零
- 1. 解析
- 2. 代码
- 3. 更多解
- 二、704. 二分查找
- 1.解析
- 2.代码
- 三、27.移除元素
- 四、977.有序数组的平方
- 收货
- 代码
前言
遗忘多年的CSDN密码又被我想起来了
每天都学这么多东西,还是应该留下属于自己的一些记录
不然都忘记了夺亏(笔芯:)
今天在b站看了一个up的java学习路线,感觉其中很多东西都似曾相识,但在脑海中是零散的碎片。
我想试试能不能把这些碎片串起来,千里之行始于leetcode! 这里加入那个视频的链接~ java学习路线
一、283.移动零
1. 解析
看到题干之后,虽然明知道是数组题,但是我还是想起了我最爱的双指针(bushi
可能潜意识里觉得双指针时间复杂度会更低(事实证明确实如此,时间复杂度O(N))
大概思路就是,准备 first 和 last 两个指针(这里可以理解为分别指示每个时刻0区间的首和尾):
①从前向后遍历数组,找到第一个0的位置。(如果没有0或者仅有一个0在数组最后就可以直接返回了);
②last 指针指向first + 1 的位置,如果值不为0,就和 first 指向的元素调换,随后first和last指针后移;如果值为0,不做调换,只将last指针后移;
③当last指针移动到数组末尾,整个0区间也移动到了数组末尾,返回;
这道题还是练到一些java数组语法的,但不多(
2. 代码
class Solution {public void moveZeroes(int[] nums) {int first = 0;int last = 0 ;//把first 定位到第一个0的位置,或者数组中压根儿没0while(first < nums.length && nums[first] != 0 ){first ++;}//如果没0或者只有一个零在末尾,直接返回,否则last = first后面的那个if(first == nums.length || first == nums.length - 1){return;}else{last = first + 1 ;//last也指向第一个0}//last向后遍历while(last < nums.length){if( nums[last] != 0){//调换first和lastint temp = nums[first];nums[first] = nums[last];nums[last] = temp;first += 1;}last += 1;}return;}
}
3. 更多解
看了官解发现也是双指针(笑活
而且在评论区看到一种神奇的方法
感觉类似于对于每轮for循环,cont记载了这个元素之前0区间的长度,这样就可以和0区间的第一个0交换,代码更简单了,时间复杂度也是O(N)
二、704. 二分查找
1.解析
没啥好说的,背代码就完事了
2.代码
class Solution {public int search(int[] nums, int target) {//定义首尾的指针int left = 0;int right = nums.length - 1 ;int mid = 0;//循环条件是小于等于while(left <= right){mid = (left + right) / 2;if(nums[mid] == target){return mid;}else if(nums[mid] < target){left = mid + 1;}else{right = mid - 1;}}return -1;}
}
三、27.移除元素
这个跟283挺像的
class Solution {
public:int removeElement(vector<int>& nums, int val) {int count = 0;int temp = 0;int length = nums.size();for(int i = 0;i < length; i++){if(nums[i] == val){count += 1 ;}else{temp = nums[i];nums[i] = nums[i - count];nums[i - count] = temp;}}return length - count;}
};
四、977.有序数组的平方
收货
好困
归并排序可以用两种方法写。事实上前一个更好理解,第二个只是写出来之后觉得可以优化。
学到了java数组的定义 int[] name = new int[length],添加元素必须用下标,但是Vector可以用 .add()方法
还有就是数组的排序方法 Arrays.sort(name)
代码
class Solution {public int[] sortedSquares(int[] nums) {int[] sortedNums = new int[nums.length];int p1 = -1;for (int i = 0; i < nums.length; i++){if(nums[i] < 0){p1 = i; //指向最后一个小于0的下标}nums[i] = nums[i] * nums[i];}//定位最后一个负数和第一个非负数int p2 = p1 + 1;int index = 0;//归并排序// while(p1 > -1 || p2 < nums.length){// if(p2 >= nums.length){// sortedNums[index] = nums[p1];// --p1;// }else if(p1 <= -1){// sortedNums[index] = nums[p2];// ++p2;// } else if(nums[p1] <= nums[p2]){// sortedNums[index] = nums[p1];// --p1;// }else{// sortedNums[index] = nums[p2];// ++p2;// }// ++index;// }while(p1 > -1 || p2 < nums.length){if(p2 >= nums.length || p1>=0 && nums[p1] <= nums[p2]){sortedNums[index] = nums[p1];--p1;}else{sortedNums[index] = nums[p2];++p2;}++index;}return sortedNums;}}