今天被P老师看见刷B站了,下午想到了一个还不错的Idea, 做做调研看看会不会被reject掉,今天真的好懒惰, 今天可能不做太多太难的题了,明天还要起大早上英语课,我真的是好烦哟,我真的不想做题啊啊啊啊
1. 反转单链表
这道题没啥可说的,各种方法都能解决,但是我仿佛记得我多年前面测试的时候被问过一次,反转单链表,反正就遍历一遍,把指针指向他前一个,思路倒还可以,但是记得有一个坑,就是当链表为Null的情况要考虑呀!
public Class Solution{
public ListNode reverseList(ListNode head){
if(head==null)
return null;
ListNode pre=null, head=null;
while(head!=null){
next=head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}
2. 旋转数组的最小值
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
这道题暴解可以解但是没利用到题目所给的旋转特性,暴解一定拿不到Offer, 所以感觉考察的是也并不是网上说的二分查找,应该是逆序对,一旦出现了逆序对,那么说明就找到旋转点,那后面那个必为最小值,是一个思维题的感觉,但是用二分查找的时间复杂度更低,感觉这一题并不是很好。
逆序对解法:
public class Solution{
public int minNumberInRotateArray(int [] array) {
int length = array.length;
if(array.length==0)
return 0;
else{
for(int i=0;i<length;i++)
{
if(array[i]>array[i+1])
return array[i+1];
}
}
return array[0];
}
}
变向二分查找解法:
先定义三个Index, 分别是low, mid 和 high
low=0, high=length-1, mid=(low+high)/2
分下面几种情况讨论:
- 数组本身就是有序的,[1,2,3,4,5]不需要旋转,这个时候我们只需要返回0,如果是这种情况,显然特征就是array[low]<array[high]这样的话,直接return array[low]
- 数组遭到了旋转,就是[4,5,1,2,3]的情况,如果array[mid]>array[low], 那说明还在翻转序列中,显然前面的都不会有最小值,跳过前面所有的段,所以low=mid+1
- 那如果是,array[mid]<array[high], 那说明后面是升序,那就没必要再去看了,最大值就可以确定到mid, high=mid
- 但是有一种情况,就是low和mid相等的情况,[1,0,1,1,1]相等的话,如果中间夹了个0就会被错过,所以相等的时候, low++就好
public class Solution {
public int minNumberInRotateArray(int [] array) {
int length=array.length;
int low=0;
int high=length-1;
int mid=(low + high)/2;
if(length==0)
return 0;
while(low < high){
if(array[low]<array[high])
return array[low];
if(array[low]<array[mid]) low=mid+1;
else if(array[mid]<array[high] high=mid;
else low++;
}
return array[low];
}
}