刷题第三天

今天被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. 数组本身就是有序的,[1,2,3,4,5]不需要旋转,这个时候我们只需要返回0,如果是这种情况,显然特征就是array[low]<array[high]这样的话,直接return array[low]
  2. 数组遭到了旋转,就是[4,5,1,2,3]的情况,如果array[mid]>array[low], 那说明还在翻转序列中,显然前面的都不会有最小值,跳过前面所有的段,所以low=mid+1
  3. 那如果是,array[mid]<array[high], 那说明后面是升序,那就没必要再去看了,最大值就可以确定到mid, high=mid
  4. 但是有一种情况,就是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];
    
    }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值