一、在一个二维数组中,每一行都按从左到右递增的顺序排序,每一列都按从上到下的递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路:

首先选取数组中右上角的数字。如果该数字等于要查找的的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围剔除一行或一列,这样每一步都可以缩小查找的范围。

实现过程如下:

wKiom1c11Xfzs0-WAAAN-uL1gHo691.jpg

wKioL1c11lqx8yC4AABxCUYvO1E228.jpg

wKiom1c11XfyrQBoAAA87hOqtYg329.jpg

运行结果如下:

wKiom1c11XjSHegUAAANb2w3sGM123.jpg

二、在一组整数中,只有两个数出现了一次,其它数都是成对出现的。

例如:array[10]={1,1,2,2,3,3,5,7,4,4}

思路:我们都知道一个数与它本身异或为零,与零异或为它本身。所以我们可以先让这一组数异或,其结果必不为零,假如为i。然后再从右往左找出i的二进制中第一位为1的,假设右移了count位。然后让数组中的每一个数都右移count位在与i的这一位做与运算,结果为1的为一组,剩下的为另一组,然后在分别异或。便可得出结果。

实现过程如下:

wKioL1c116nAVKhtAAAN-uL1gHo479.jpg

wKiom1c11sfzUTYdAACExbtJWGM024.jpg

wKioL1c116qzLAeKAACF8yceVUQ935.jpg

运行结果:

wKiom1c11siQHceLAAALeBCmjmQ339.jpg

若数组如下:

wKioL1c12NfwhhpBAAAP80HJ1Gg488.jpg

运行结果:

wKiom1c11_WjAU2eAAALAuCXqtQ330.jpg

三、有一组按从小到大排序的数组,经过移位后变成了如下所示。

array[10]={0,1,2,3,4,5,6,7,8,9};

右移两位后:array[10]={2,3,4,5,6,7,8,9,0,1}

右移四位后:array[10]={4,5,6,7,8,9,0,1,2,3,}

右移五位后:array[10]={5,6,7,8,9,0,1,2,3,4}

请设计一个函数,输入一个数查找其是否在移位后的数组中,并不知道数组经过几位移位,要求时间复杂度小于(O(n))。

由于时间复杂度的要求所以不能遍历,虽然数组经过了移位,但其实是被分成了两个有序的部分。主要就是确定要查找的数位于哪一部分,其本质上还是二分查找,如果array[mid]<array[left],说明array[mid]的右边是有序序列,反之则说明它的左边是有序序列。然后在与要查找的数做比较。

具体实现如下:

wKioL1c14Izjjx4oAAAN-uL1gHo953.jpg

wKiom1c136qyJfdmAACMI6kwyZ0523.jpg

wKioL1c14I2ij7G_AACYD8hk-c4578.jpg

运行结果如下:

wKiom1c136vA2Y4pAAANYktXw20976.jpg