704:
第一眼看到题目感觉不难,但是发现需要用到O(logn),有点忘记怎么写才会达到这一种runtime complexity。
根据704题目,去查什么是binary search,先看了Binary Search - Data Structure and Algorithm Tutorials - GeeksforGeeks
的讲解,理解了binary search是怎么操作的。
在尝试中,不断碰到Time Limit Exceeded的问题,一直在debug。后面发现还是对区间的定义不准确。重新读了第一种写法以后,发现当(nums[middle] > target)时,middle - 1是漏掉了。因为middle一定不是要寻找的target,所以从middle - 1 开始寻找。
学会新的找mid的方式 int mid = left + (right-left)/2,防止溢出
最后我又删掉了第一遍所写的code,重新写了一遍,重新回顾每一个点。
Code:
class Solution {
public int search(int[] nums, int target) {
int left = 0;
//last number index number
int right = nums.length -1;
while(left <= right){
int mid = left + (right-left)/2;
if(nums[mid] == target){
return mid;
}
else if(nums[mid] < target){
left = mid + 1;
}
else if(nums[mid] > target){
right = mid -1;
}
}
return -1;
}
}
总用时: 45min
27:
根据题目,先使用了暴力解法。用了两个for loop,成功。
Code:
class Solution {
public int removeElement(int[] nums, int val) {
int size = nums.length;
for(int i = 0; i<size; i++){
if(nums[i] == val){
for(int j = i+1; j<size; j++){
nums[j-1] = nums[j];
}
i--;
size--;
}
}
return size;
}
}
然后学习如何使用双指针法,卡在第二个例子,总是output [0,1,0,0,3],4不见了。
Code:
class Solution {
public int removeElement(int[] nums, int val) {
//two pointers
int size = nums.length;
int i=0;
for(int j=size-1; j>=0; j--){
if(nums[i] != val){
i++;
}else if(nums[i] == val){
if(nums[j] != val){
nums[i] = nums[j];
}
size--;
}
}
return size;
}
}
还不知道为什么错。
决定换一个思路,最后发现直接swap就好了。
Code:
class Solution {
public int removeElement(int[] nums, int val) {
//two pointers
int i=0;
for(int j=0; j<nums.length; j++){
if(nums[j] != val){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
}
}
return i;
}
}
27用时:1.5h
总结:
好久没有写代码,感觉对algorithm的理解非常生疏。习惯于上手就写,没有提前构思,总是边写边想。以后应该先构思,多画图去理解,不要试出来答案。而且感觉应该先理解透彻每一道题目的思路是什么再去写,对于算法的理解不够透彻,希望第二天能先理解再去写,过程比结果更重要。