数组问题 1.行列有序二维数组中查找2.在一组数成对出现的数中有两个数只出现一次3.在移位数组中查找一个数

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

思路:

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

实现过程如下:

运行结果如下:

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

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

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

实现过程如下:

运行结果:

若数组如下:

运行结果:

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

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]的右边是有序序列,反之则说明它的左边是有序序列。然后在与要查找的数做比较。

具体实现如下:

运行结果如下:

时间: 2024-08-03 18:30:36

数组问题 1.行列有序二维数组中查找2.在一组数成对出现的数中有两个数只出现一次3.在移位数组中查找一个数的相关文章

&nbsp; 动态开辟有序二维数组

#include<stdio.h>#include<stdlib.h>int main(){ //int arr[3][4] // int row; int col; scanf_s("%d%d", &row, &col); int  **q = (int **)malloc(sizeof(int)* row);//开辟一块空间 存储一个含有row数组指针的数组 q[0] = (int *)malloc(sizeof(int)*col); for

稀疏数组的经典应用(二维数组与稀疏数组的相互转换)

package com.zhangwl.数据结构.稀疏数组; /** * @ClassName SparseArray * @Description 棋盘游戏演示 * @Author zhangwl * @Date 2019/10/10 22:54 * @Version 1.0 **/public class SparseArray { public static void main(String[] args) { /*创建一个原始的二维数组11 * 11 ,0:表示没有棋子 :1:表示黑子:

将树形结构的数组按照顺序遍历为二维数组

/** * 将树形结构的数组按照顺序遍历为二维数组 * renxing,2015年8月7日 11:06:47 */ function arr_child ($array) { static $res; if (!is_array($array)) { return false; } foreach ($array as $k=>$v) { if (is_array($v) && isset($v['child'])) { $child = $v['child']; //将这个数组的子

一串数字中有两个只出现一次的数字其余都是成对相同,求这两个数

当然如果这个问题是只有一个不同的数,其他数字成对相同,那么就是把所有数字异或就得出这个数了 这次是有两个只出现一次的数字,其他数字都成对相同 1)先把所有数都异或得到数t 2)算出t的二进制第一个1的位置flag 3)将所有数根据二进制flag位置是否为1分成两组b1[],b2[] (此时每组数字的个数一定是奇数) 4)将b1组异或得到ans1,将b2组异或得到ans2 #include<iostream> #include<stdio.h> using namespace std

有序二维数组中搜索特定的数

关于二维有序数组中搜索,其题目如下: 给定一个矩阵,都是整数,每一行从左到右升序,每一列从上到下有序,例如下面的矩阵 [ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ] 请用最快的时间找出特定的数,例如,输入3,存在这个数,输入15,不存在这个数. 实现如下的函数bool FindArray(int *pArray,int nWidth,int nheight,int nKey). 最笨的方法是逐个遍历进行比较,如果是这样,这题目就没什么意义

有序二维数组中的查找

一个二维数组,每一行按照从左到右递增,每一列按照从上到下递增,查找数组中是否存在某个数.如数组: 1  2  8    9 2  4  9   12 4  7  10  13 6  8  11  15 思路: 这道题有其特殊性,从右上角或者左下角开始查找的方向是确定的.这句话是说比如是查找7,我们从右上角开始,9大于7,则减少列下标,查找13的话就增加行下表,查找的方向是确定的,这样就容易实现了. public class Item03 { public static void main(Str

查找有序二维数组中的元素

给定一个已排序的二维数组array,在其中查找一个元素value 查找策略如下图: (1)将value和数组的右上角的值比较,如果大于右上角的值,则移除数组的第一行. (2)将value和数组的左下角的值比较,如果大于左下角的值,则移除数组的第一列. (3)直到查找完毕,已经找不到符合(1)(2)的情况后,或者数组只剩下一个元素 (4)得到一个较小的二维数组,再遍历该数组即可.             /** * Created by wuchao on 17-3-29. */ import j

Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)

1.问题描述 写一个高效的算法,从一个m×n的整数矩阵中查找出给定的值,矩阵具有如下特点: 每一行从左到右递增. 每一列从上到下递增. 2. 方法与思路 2.1 二分查找法 根据矩阵的特征很容易想到二分法,但是这是一个二维的矩阵,如何将问题转化为一维是关键.实际上我们可以根据矩阵的第一列确定值可能所在的行的范围(limu,limd),其中limu=0,使得matrix[0][0]≤matrix[i][0]≤matrix[limd][0],i∈[0,limd].而确定limd的值可以使用二分法.

第二十一节(数组概要, 一维、二维数组的声明和使用,数组的排序,数组的查找,)

一维数组:1:/* 数组: 1. 数组是一种引用类型 2. 数组是一种简单的数据结构,线性的机构 3. 数组是一个容器,可以用来存储其他元素, 4. 数组也是可以存储任意数据类型的元素 5. 数组分为: 一维数组,二维数组,三维数组,多维数组 6. 数组中的存储的元素类型 是统一的 7. 数组的长度是不可变的,数组一旦创建长度就是不可变的,固定的 声明数组语法: <1>. 数组元素的类型[] 变量名称 <2>. 数组元素的类型 变量名称[] */ public class Arra