剑指offer:数组
创始人
2024-03-31 14:18:14

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;

 

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...