【剑指offer】之【数组】

3. 二维数组中的查找

题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解法一:暴力法

  • 首先是暴力破解法
    运行时间:172 ms
    占用内存:18432K
public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array == null || array.length == 0){
            return false;
        }
        for(int i = 0;i < array.length;i++){
            for(int j = 0;j < array[0].length;j++){
                if(target == array[i][j]){
                    return true;
                }
            }
        }
        return false;
    }
}

解法二:从后遍历

  • 利用从左到右递增 从上到下递增的规律,先判断是那一层的再判断具体的哪个数。

运行时间:160ms
占用内存:17928k

public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array == null || array.length == 0 || array[0].length == 0){
            return false;
        }
        int len = array.length;
        for(int i =  0; i <  len ;i++){
            if(target <= array[i][len - 1]){
                for(int j = array.length - 1; j >= 0;j--){
                    if(target == array[i][j]){
                        return true;
                    }
                }
            }     
        }
        return false;
    }
}

数组中重复的数字

题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

解法一:先排序再判断

package 剑指offer.数组;

import java.util.Arrays;

/**
 * 剑指offer - 数组中重复的数字
 * @author zhx
 */
public class 数组中重复的数字 {
    public boolean duplicate(int numbers[],int length,int [] duplication) {
        if(length == 0 || numbers == null){
            return false;
        }
        //2 3 1 0 2 5 3
        //0 1 2 3 4 5 6
        //0 1 2 2 3 3 5
        Arrays.sort(numbers);
        int res = numbers[0];

        for(int i = 1; i< length;i++){
            if(res == numbers[i]){
                duplication[0] = numbers[i];
                return true;
            }
            res = numbers[i];
        }
        return false;
    }
}

构建乘积数组

题目描述
给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。(注意:规定B[0] = A[1] * A[2] * … * A[n-1],B[n-1] = A[0] * A[1] * … * A[n-2];)

解法一:利用中间值构建左右连乘

import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] A) {
        int k = 1;
        int[] res = new int[A.length];

        for(int i = 0;i < A.length;i++){
            res[i] = k;
            k = k * A[i];
        }
        k = 1;
        for(int i = A.length - 1;i >=0;i--){
            res[i] *= k;
            k = k * A[i];
        }
        
        return res;
    }
}
发布了118 篇原创文章 · 获赞 5 · 访问量 8732

猜你喜欢

转载自blog.csdn.net/weixin_43672855/article/details/104732470
今日推荐