1、二维数组中的查找
题目描述:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
根据题目描述我们可以得知:每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。有两种方法:从二维数组的右上角或者左下角开始查找。
方法一:从二维数组的右上角开始查找
如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则说明该列其他元素都大于要查找的数字,便可以删掉该列;如果该数字小于要查找的数字,则说明该行其他元素也都小于要查找的数字,便可以删掉该行。
每一次比较都可以剔除一行或者一列,进而缩小查找范围。
代码实现:
public class Solution {public boolean Find(int target, int [][] array) {if(array == null)return false;int r = array.length;int c = array[0].length;int i = 0,j = c-1;for(;i=0;){if(array[i][j] == target)return true;else if(array[i][j]
方法二:从二维数组的左下角开始查找
如果该数字等于要查找的数字,则查找过程结束;如果该数字大于要查找的数字,则说明该行其他元素都大于要查找的数字,便可以删掉该行;如果该数字小于要查找的数字,则说明该列其他元素也都小于要查找的数字,便可以删掉该列。
代码实现:
public class Solution {public boolean Find(int target, int [][] array) {if(array == null)return false;int r = array.length;int c = array[0].length;int i = r-1,j = 0; for(;i>=0&&jtarget)i--;elsej++;}return false;}
}
知识点:
在一维数组a[ ]中,a.length 方法的意思就是返回这个数组的长度。
比如a[ ] = {1,2,3,4,5};则a.length = 5;在二维数组b[ ][ ]的length方法代表着什么呢?
在二维数组中,如果直接调用b.length方法,返回的则是b数组的行数。
如果是b[0].length方法则返回的是第0行所代表的长度。如果说每个一维数组的长度相同,那么b[0].length就是列数了。
2、旋转数组的最小数字
题目描述:
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。注意:给出的所有元素都大于0,若数组大小为0,请返回0。
解题思路:
1.你可以直接对数组进行遍历找到最小值(这肯定不是这道题目的意义啊)
2.使用二分的方法
方法一:直接对数组进行遍历
代码实现:
import java.util.ArrayList;
public class Solution {public int minNumberInRotateArray(int [] array) {int m = array[0];for(int sum:array){if(sum
方法二:二分查找
详细思路:如果整个数组是有序的,那我们一定会想到用折半查找来实现。对于旋转数组,我们发现,它实际上可以划分为两个排序的子数组,而且前面数组的元素都不小于后面数组的元素,并且最小值正好就是这两个数组的分界线,由此,我们可以得出以下解决方法。
首先用两个指针b和e分别指向数组的第一个元素和最后一个元素,然后可以找到中间元素mid。对于这个中间元素,有以下两种情况:(1)该元素大于等于b指向的元素,此时最小的元素说明在mid的后面,可以把b=mid;(2)中间元素小于等于e指向的元素,那么最小元素在mid之前,可以e=mid。特别注意:这里不要+1或者-1,因为只有这样才能保证b始终在第一个数组,e始终在第二个数组。依次循环,当最后b和e相差1时,b指向第一个数组的最后一个,e指向第二个数组的第一个(即为我们要找的最小值)。
当然,还需要有特殊情况的判断:
1、将数组前0个元素移动到后面(相当于没有旋转,数组整体有序)。明显我们上面的分析没有包含这种情况,需要特殊处理,方法也很简单,将第一个元素和最后一个元素相比,若第一个元素小于最后一个元素,则说明最小值就是的第一个元素,可以直接返回。
2、首尾指针指向的数字和中间元素三者都相等时,无法判断中间元素位于哪个子数组,无法缩小问题规模。此时,只能退而求其次,进行顺序查找。
代码实现:
import java.util.ArrayList;
public class Solution {public int minNumberInRotateArray(int [] array) {int n = array.length;if(n==0)return 0;int b = 0,e = array.length-1;if(array[0]=array[b])b = mid;else if(array[mid]<=array[e])e = mid;if(e-b == 1)return array[e];}return -1;}int minsort(int [] array){int m = array[0];for(int sum:array)if(sum
说明:
在这里没有使用到import java.util.ArrayList;
上一篇:[C]编译和预处理详解