LeetCode刷题记---240/496/869

文章目录

240.搜索二维矩阵II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。
LeetCode刷题记---240/496/869
思路:由于每行都是有序的,所以可以对每行进行二分查找


import java.util.Arrays;

public class Solution240 {
    public boolean searchMatrix(int[][] matrix, int target) {
        for(int i = 0;i < matrix.length;i++){
            int index = Arrays.binarySearch(matrix[i],target);
            if(index >= 0){
                return true;
            }
        }
        return false;
    }
}

496.下一个更大元素

给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。

nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。

LeetCode刷题记---240/496/869
思路:暴力枚举


public class Solution496 {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
        int []nextGreaterIndex = new int[nums1.length];
        for(int i = 0;i < nums1.length;i++){
            int j = 0;
            while (j < nums2.length && nums1[i] != nums2[j]){
                j++;
            }
            nextGreaterIndex[i] = -1;
            for(j = j + 1;j < nums2.length;j++){
                if(nums1[i] < nums2[j]){
                    nextGreaterIndex[i] = nums2[j];
                    break;
                }
            }
        }
        return nextGreaterIndex;
    }
}

869.重新排列得到2的幂

给定正整数 N ,我们按任何顺序(包括原始顺序)将数字重新排序,注意其前导数字不能为零。

如果我们可以通过上述方式得到 2 的幂,返回 true;否则,返回 false。

LeetCode刷题记---240/496/869


import java.util.ArrayList;

public class Solution869 {
    //先进行全排列获得n的所有可能,但排列后n的位数不能变,否则舍弃
    public boolean reorderedPowerOf2(int n) {
        //将n分割成个位数
        int []arr = split(n);
        //进行排列出所有可能
        ArrayList<Integer> arrList = new ArrayList<>(); //用来存储结果
        int len = arr.length;
        boolean []isUsed = new boolean[len];
        DFS(len,arr,arrList,isUsed,new StringBuilder());
        for(int i = arrList.size() - 1;i >= 0;i--){
            //判断这个数是否是2的幂
            if(String.valueOf(arrList.get(i)).length() != len){
                continue;       //如果存在前导零则长度不会等于源长度,舍弃
            }
            if(judge(arrList.get(i))){
                return true;
            }
        }
        return false;

    }

    boolean judge(int n){
        while (n != 1){
            if(n % 2 == 0){
                n = n >> 1;
            }else {
                return false;
            }
        }
        return true;
    }

    /**
     *
     * @param len   表示每个元素的长度
     * @param arr   源数组
     * @param arrList  存储数组
     * @param isUsed    标记数组
     */
    private void DFS(int len, int []arr, ArrayList<Integer> arrList, boolean []isUsed,StringBuilder sb){

        if(len <= 0){
            arrList.add(Integer.parseInt(sb.toString()));
            return;
        }

        for(int i = 0;i < arr.length;i++){
            if(isUsed[i]){  //如果已经被使用则跳过
                continue;
            }
            sb.append(arr[i]);
            isUsed[i] = true;
            DFS(len - 1,arr,arrList,isUsed,sb);
            sb.deleteCharAt(sb.length() - 1);
            isUsed[i] = false;
        }

    }

    private int []split(int n){
        int []arr = new int[String.valueOf(n).length()];
        int i = 0;
        while (n != 0){
            arr[i++] = n % 10;
            n = n / 10;
        }
        return arr;
    }
}

上一篇:合并两个有序数组(Java)——LeetCode88


下一篇:LeetCode:寻找两个正序数组的中位数