Day1打卡! 时长:2.5h
今日感想:这是我第一次真正意义上的刷算法,并且认认真真的记录博客。由于是第一天,还是有很大的新鲜感的,不管是思考解题还是撰写博客,都在不断尝试。希望在卡哥的带领下和各位录友们的陪伴下能够坚持下去💪!
数组理论基础
数组是存放在连续内存空间上的相同类型数据的集合。
可通过下标索引方式获取相应数据,下标从0开始。
数组内存空间的地址是连续的。
数组的元素不能删除,只能覆盖。
对于二维数组,在C++中地址空间上是连续的,在Java中不是连续的。
Leetcode704 二分查找
题目链接:Leetcode704 二分查找
第一想法:首先根据题目应该有一个整型数组nums和一个目标值target变量,其次还要设置当前数组下标的最小值min=0和最大值max=size-1。由于数组是升序的,每次取下标值middle=(min+max)/2下标的值同target作比较,如果数组值大了,就修改max=middle-1。反之,数组值小了,就修改min=middle+1,循环比较,若相等,返回middle值。
讲解后想法:重点是要根据数组左闭右闭还是左闭右开来抉择循环不变量的取值,我都没考虑边界问题,不细节。
左闭右闭 [ ] 时,while(min<=max),middle大则修改max=middle-1,小则修改min=middle+1。
左闭右开 [ ) 时,max=size,while(min<max),middle大则修改max=middle,小则修改min=middle+1。
遇到的困难:哈,第一题就被难住了,提键盘忘代码。发现自己真的到应用的时候,竟然不知从何下笔。也有可能是因为当初学数据结构的时候用的是C语言,而现在在用Java。
代码:左闭右闭版本
class Solution {
public int search(int[] nums, int target) {
int min = 0;
int max = nums.length - 1;
if(target < nums[min] || target > nums[max]){
return -1;
}
while(min <= max){
int mid = min + ((max - min) >> 1);
//右移m>>n 代表把数字m除以2的n次方。若为单数,则是将m除以2的n次方的整数商。
if(nums[mid] == target)
return mid;
else if(nums[mid] < target)
min = mid + 1;
else if(nums[mid] > target)
max = mid - 1;
}
return -1;
}
}
Leetcode27 移除元素
题目链接:Leetcode27 移除元素
第一想法:刚拿到这道题有点懵,突然没有思路。感觉应该是从0下标到数组长度逐个对比删除,但是每次又要涉及后面的元素往前移动。看了看示例,发现应该删除的位置补零也可以,我猜测可以遍历的时候先将相应位置补零,这样不涉及移位的问题,然后再把不是零的元素往前挪。
讲解后想法:害,当初学的指针现在都忘到脑后头去了。看了讲解终于拾回点记忆。并且领悟了快慢指针的方法发现是真的巧妙!
遇到的困难:数组以及指针这方面知识有点忘了,回去着重复习一下。
代码:快慢指针版
class Solution {
public int removeElement(int[] nums, int val) {
//快慢指针法
int slow = 0;
for(int fast = 0; fast < nums.length; fast++){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}