01 数组

977. 有序数组的平方二分法使用前提:有序数组

704. 二分查找

二分法:分别可以利用[a,b]或[a,b)来处理边界 

34. 在排序数组中查找元素的第一个和最后一个位置

方法一:二分法(nums[mid]==target应与其他情况合并,否则会超出时间) 

class Solution {
    public int[] searchRange(int[] nums, int target) {
        int len=nums.length;
        if(len==0){
            return new int[]{-1,-1};
        }

        int firstPosition=findFirstPosition(nums,target);
        if(firstPosition==-1){
            return new int[]{-1,-1};
        }

        int lastPosition=findLastPosition(nums,target);
        return new int[]{firstPosition,lastPosition};
    }

    private int findFirstPosition(int[] nums,int target){
        int left=0;
        int right=nums.length-1;
        while(left<=right){
            int mid=left+((right-left)/2);
            if(nums[mid]<target){
                //下一轮搜索区间是[mid+1,right]
                left=mid+1;
            }else if (nums[mid] >= target) {
                //下一轮搜索区间是[left,mid-1]
                right=mid-1;
            }
        }
        if(left>=nums.length||nums[left]!=target){
            return -1;
        }
        return left;
    }

    private int findLastPosition(int[] nums,int target){
        int left=0;
        int right=nums.length-1;
        while(left<=right){
            int mid=left+((right-left)/2);
            if(nums[mid]<=target){
                //下一轮搜索区间是[mid+1,right]
                left=mid+1;
            }else if (nums[mid] > target) {
                //下一轮搜索区间是[left,mid-1]
                right=mid-1;
            }
        }
         if (right<0||nums[right]!=target) {
                return -1;
         }
        return right;
    }
}

方法二:双指针 

public int[] searchRange(int[] nums, int target) {
        int[] res=new int[]{-1,-1};
        if(nums.length<1) return res;
        int i=0;
        int j=nums.length-1;
        while(i<=j&&nums[i]<target) i++;
        while(i<=j&&nums[j]>target) j--;
        if(i>j||nums[i]!=target||nums[j]!=target) return res;
        res[0]=i;
        res[1]=j;
        return res;
    }

方法三:暴力查找,从左边找初始位置,从右边查找结束位置。

public int[] searchRange(int[] nums, int target) {
        if(nums.length==0) return new int[] {-1,-1};
        int left = searchLeft(nums,target);
        int right = searchRight(nums,target);
        if (left == -1 || right == -1) {
            return new int[] {-1,-1};
        }
        return new int[] {left,right};
    }

    private int searchRight(int[] nums, int target) {
        for (int i = nums.length - 1; i >= 0; i--) {
            if (nums[i] == target) {
                return i;
            }
        }
        return -1;
    }

    public int searchLeft(int[] nums,int target) {
        for (int i = 0; i < nums.length; i++) {
            if (nums[i] == target) {
                return i;
            }
        }
        return -1;

    }

35. 搜索插入位置

27. 移除元素

方法1:暴力;方法2:双指针

        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;
       int n = nums.length;
        int left = 0;
        for (int right = 0; right < n; right++) {
            if (nums[right] != val) {
                nums[left] = nums[right];
                left++;
            }
        }
        return left;

977. 有序数组的平方(双指针)

209. 长度最小的子数组(滑动窗口)

59. 螺旋矩阵 II

public int[][] generateMatrix(int n) {
        int l=0,r=n-1,u=0,d=n-1;
        int[][] matrix=new int[n][n];
        int cum=1,end=n*n;
        while(true){
            for(int i=l;i<=r;i++) matrix[u][i]=cum++;
            if(++u>d) break;
            for(int i=u;i<=d;i++) matrix[i][r]=cum++;
            if(--r<l) break;
            for(int i=r;i>=l;i--) matrix[d][i]=cum++;
            if(--d<u) break;
            for(int i=d;i>=u;i--) matrix[i][l]=cum++;
            if(++l>r) break;
        }
        return matrix;
    }
public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> res=new LinkedList<>();
        if(matrix.length==0) return res;
        int u=0,d=matrix.length-1,l=0,r=matrix[0].length-1;
        while(true){
            for(int i=l;i<=r;i++) res.add(matrix[u][i]);
            if(++u>d) break;
            for(int i=u;i<=d;i++) res.add(matrix[i][r]);
            if(--r<l) break;
            for(int i=r;i>=l;i--) res.add(matrix[d][i]);
            if(--d<u) break;
            for(int i=d;i>=u;i--) res.add(matrix[i][l]);
            if(++l>r) break;
        }
        return res;
    }

54.螺旋矩阵(opens new window) 

public int[] spiralOrder(int[][] matrix) {
        if(matrix.length == 0) return new int[0];
        int l = 0, r = matrix[0].length - 1, u = 0, d = matrix.length - 1, x = 0;
        int[] res = new int[(r + 1) * (d + 1)];
        while(true) {
            for(int i = l; i <= r; i++) res[x++] = matrix[u][i]; // left to right.
            if(++u > d) break;
            for(int i = u; i <= d; i++) res[x++] = matrix[i][r]; // top to bottom.
            if(l > --r) break;
            for(int i = r; i >= l; i--) res[x++] = matrix[d][i]; // right to left.
            if(u > --d) break;
            for(int i = d; i >= u; i--) res[x++] = matrix[i][l]; // bottom to top.
            if(++l > r) break;
        }
        return res;

    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值