Leetcode-11.17

下一个排列-中等

这题需要注意很多细节问题。

class Solution {
    public void nextPermutation(int[] nums) {
        int i=nums.length-1;//标注末尾索引
        while(i>0){
            if(nums[i]<=nums[i-1]){
                i--;
            }else{
                int small=i-1;
                for(int j=nums.length-1;j>=i;j--){
                    if(nums[j]>nums[small]){
                        int tmp=nums[small];
                        nums[small]=nums[j];
                        nums[j]=tmp;
                        break;
                    }

                }
                for(int k=i;k<(nums.length+i)/2;k++){
                    int tmp=nums[k];
                    nums[k]=nums[nums.length-1+i-k];
                    nums[nums.length-1+i-k]=tmp;

                }
                break;
            }
        }
        if(i==0){
            for(int j=0;j<(nums.length)/2;j++){
                int tmp=nums[j];
                nums[j]=nums[nums.length-1-j];
                nums[nums.length-1-j]=tmp;
            }
        }
    }
}

跳跃游戏-中等

刚开始用递归写,也能做出来但是超出了时间限制,后来又看了别人的代码,改了一下。

class Solution {
    public boolean canJump(int[] nums) {
        int k=0;//用来标识可以跳的最远的距离
        for(int i=0;i<nums.length-1;i++){
            if(k<i+nums[i]){
                k=i+nums[i];
            }
            if(k==i&&nums[i]==0){
                return false;
            }
        }
        return k>=nums.length-1;
    }
}

搜索旋转排序数组-中等

关键在于判断完所有的情况

class Solution {
    public int search(int[] nums, int target) {
        if(nums.length==1){
            if(target==nums[0]){
                return 0;
            }else{
                return -1;
            }
        }
        int medium=nums.length/2;
        int start=0;
        int end=nums.length-1;
        while(true){
            if(nums[medium]==target){
                return medium;
            }
            if(target==nums[start]){
                return start;
            }
            if(target==nums[end]){
                return end;
            }
            if(medium==start||medium==end){
                return -1;
            }
            if(nums[start]<nums[end]){
                if(target>nums[medium]){
                    start=medium;
                    medium=(start+end)/2;
                }else{
                    end=medium;
                    medium=(start+end)/2;
                }
            }else if(target>nums[start]&&target>nums[medium]&&nums[start]<=nums[medium]){
                start=medium;
                medium=(start+end)/2;
            }else if(target>nums[start]&&target>nums[medium]&&nums[start]>nums[medium]){
                end=medium;
                medium=(start+end)/2;
            }else if(target>nums[start]&&target<nums[medium]){
                end=medium;
                medium=(start+end)/2;
            }else if(target<nums[start]&&target>nums[end]){
                return -1;
            }else if(target<nums[start]&&target<nums[end]){
                if(nums[medium]>=nums[start]||target>nums[medium]){
                    start=medium;
                    medium=(start+end)/2;
                }else{
                    end=medium;
                    medium=(start+end)/2;
                }
            }
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值