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;
}
}