数组

2023-05-16

一、数组中重复的数字

题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

解题思路:考虑用哈希表进行操作。第一遍遍历整个数组更新哈希表值,第二遍遍历哈希表中对应元素值大于1的元素,输出该元素即为待查找元素。

classSolution {
public:
    // Parameters://        numbers:     an array of integers//        length:      the length of array numbers//        duplication: (Output) the duplicated number in the array number// Return value:       true if the input is valid, and there are some duplications in the array number//                     otherwise falseboolduplicate(int numbers[], int length, int* duplication){
        //判空操作if(numbers==NULL||length==0)
            returnfalse;
        //定义并遍历哈希表int hashpub[7]={0};
        for(int i=0;i<length;i++)
        {
            hashpub[numbers[i]]++;
        }
        for(int j=0;j<length;j++)
        {
            if(hashpub[numbers[j]]>1)
            {
                duplication[0]=numbers[j];
                returntrue;
            }
        }
        returnfalse;
    }
};

二、二维数组中的查找

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

解题思路:本题可以从左下角或者右上角两个方向进行搜索,以从左下角搜索为例,若左下角的数字小于待查找数字,则应该继续往该行右侧查找;若左下角的数字大于待查找数字,则应该从上面的行查找。

#方法一:从左下角开始遍历
classSolution {
public:
    boolFind(int target, vector<vector<int> > array){
        //判空操作if(array.empty())
            returnfalse;
        int row=array.size()-1; //行遍历int column=0;
        while(row>=0&&column<array[0].size())
        {
            if(array[row][column]==target)
                returntrue;
            elseif(array[row][column]>target)
            {
                row--;
            }
            else
                column++;
        }
        returnfalse;
    }
};
#方法二:从右上角开始遍历
classSolution {
public:
    boolFind(int target, vector<vector<int> > array){
        if(array.empty())
            return0;
        int row=0;
        int col=array[0].size()-1;
        while(col>=0&&row<array.size())
        {
            if(target==array[row][col])
                return1;
            elseif(target<array[row][col])
                col--;
            else
                row++;
        }
        return0;
    }
};

三、构建乘积数组

题目:给定一个数组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];)

解题思路:这里可以考虑B[j]=(A[0]*...*A[j-1])*(A[j+1]*...*A[n-1])两部分分别求解,先对右半部分乘,再对左半部分乘。

classSolution {
public:
    vector<int> multiply(const vector<int>& A){
        int n=A.size();
        vector<int>B(n);
        int ret=1;
        //求右边for(int i=0;i<n;ret*=A[i++])
        {
            B[i]=ret;
        }
        ret=1;
        for(int j=n-1;j>=0;ret*=A[j--])
        {
            B[j]*=ret;
        }
        return B;
    }
};

四、调整数组顺序使奇数位于偶数前面

题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解题思路:本题要求不仅仅是奇数部分位于前半部分,还有偶数部分位于后半部分,要想保证相对位置不变,就不能单纯通过穷举遍历来进行交换,因此在这里我用冒泡排序来解决,时间复杂度是

编辑。

classSolution {
public:
    voidreOrderArray(vector<int> &array){
        //使用冒泡排序for(int i=0;i<array.size();i++)  //外层控制趟数for(int j=array.size()-1;j>i;j--)
                if(array[j]%2!=0&&array[j-1]%2==0)
                {
                    int tmp=array[j];
                    array[j]=array[j-1];
                    array[j-1]=tmp;
                }
    }
};

五、旋转数组的最小数字(考点:查找)

题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。

NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

解题思路:本题可以考虑使用顺序查找的方法,时间复杂度为o(n)。同时,亦可以考虑使用二分查找的思路,由题目可以知后面部分总比前面部分小,那么只要将中间元素和左右两边进行对比,就可以知道最小值是在哪一边了,然后循环使用这种方法,最终只要right和left相邻,则right值即为最小值位置。

注意:在《剑指offer》中指出了两种我们需要考虑的情况

1、若排序数组的前面0个数字跑到最后面(即数组没变化),那么这时候第一个元素就是最小值,不用进行这么多遍历了

2、如果存在只挪动了1个元素的数组(如:{0,1,1,1}->{1,0,1,1}),这时候只能靠直接遍历了

classSolution {
public:
    intminNumberInRotateArray(vector<int> rotateArray){
        //判空操作if(rotateArray.empty())
            return0;
        int left=0,right=rotateArray.size()-1,mid=left;
        while(rotateArray[left]>=rotateArray[right])
        {
            mid=(left+right)/2;
            if(right-left==1)
            {
                mid=right;
                break;
            }
            if(rotateArray[mid]<=rotateArray[right])
                right=mid;
            elseif(rotateArray[mid]>=rotateArray[left])
                left=mid;
            if(rotateArray[left]==rotateArray[mid]&&rotateArray[left]==rotateArray[right])
                returnByOrder(rotateArray,left,right);
        }
        if(left>=right)
            return0;
        return rotateArray[mid];
    }
    intByOrder(vector<int>a,int l,int r){
        int min=a[l];
        for(int i=l;i<=r;i++)
            if(a[i]<min)
            {
                min=a[i];
            }
        return min;
    }
};

六、调整数组顺序使奇数位于偶数前面

题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解题思路:两次遍历,第一次遍历只保存奇数的数,第二次保存在第一次的基础上,只是这次保留的是偶数。

classSolution {
public:
    voidreOrderArray(vector<int> &array){
        int size=array.size();
        if(size==0) return;
        vector<int>res;
        for(int i=0;i<size;i++)
        {
            if(array[i]%2!=0)
                res.push_back(array[i]);
        }
        for(int i=0;i<size;i++)
        {
            if(array[i]%2==0)
                res.push_back(array[i]);
        }
        array=res;
    }
};

反思:如果题目没有相对位置不变的要求?那么考虑使用快慢指针,头指针遍历前面的,尾指针遍历后面的,头指针遍历到偶数就和尾指针交换值,尾指针遍历到奇数就和头指针交换值。

classSolution {
public:
    voidreOrderArray(vector<int> &array){
        int size=array.size();
        if(size==0) return;
        int begin=0,end=size-1;
        while(begin<end)
        {
            while(begin<end&&array[begin]%2!=0)
                begin++;
            while(begin<end&&array[end]%2==0)
                end--;
            //交换if(begin<end)
            {
                int tmp=array[begin];
                array[begin]=array[end];
                array[end]=tmp;
            }
        }
    }
};

七、旋转矩阵

题目要求:实现矩阵顺时针旋转90度

解题思路:找到替换公式,本题迎刃而解。即

编辑

//方法一:时间复杂度和空间复杂度皆为O(n^2)classSolution {
public:
    voidrotate(vector<vector<int>>& matrix){
        int n = matrix.size();
        // C++ 这里的 = 拷贝是值拷贝,会得到一个新的数组auto matrix_new = matrix;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                matrix_new[j][n - i - 1] = matrix[i][j];
            }
        }
        // 这里也是值拷贝
        matrix = matrix_new;
    }
};
//方法二:节省空间复杂度的办法classSolution {
public:
    voidrotate(vector<vector<int>>& matrix){
        int n = matrix.size();
        for (int i = 0; i < n / 2; ++i) {
            for (int j = 0; j < (n + 1) / 2; ++j) {
                int temp = matrix[i][j];
                matrix[i][j] = matrix[n - j - 1][i];
                matrix[n - j - 1][i] = matrix[n - i - 1][n - j - 1];
                matrix[n - i - 1][n - j - 1] = matrix[j][n - i - 1];
                matrix[j][n - i - 1] = temp;
            }
        }
    }
};

反思:

水平翻转:

编辑

主对角线翻转:

八、数组中只出现一次的数字

题目描述:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

解题思路:本题考查了异或操作。

  • 首先,从头到尾遍历,遍历出来不相同的数字

  • 然后通过位运算便利出来第二个出现了一次的数字

  • 最后找出来第一个出现了一次的数字

classSolution {
public:
    voidFindNumsAppearOnce(vector<int> data,int* num1,int *num2){
        int len=data.size();
        if(len<2) return;
        int counter=0;
        //先从头到尾遍历,遍历出来不同的数字for(int i=0;i<len;i++)
            counter=data[i]^counter;
        int flag=1;
        while(flag)
        {
            if(flag&counter)
                break;
            flag=flag<<1; //逐个遍历
        }
        for(int i=0;i<len;i++)
        {
            if((data[i]&flag)) *num1=*num1^data[i];
            else *num2=*num2^data[i];
        }
    }
};

九、数字在排序数组中出现的次数

题目描述:统计一数字在排序数组中出现的次数。

解题思路:使用两次遍历的方法,第一次使用二人查找,把相同的末位元素遍历出来;第二遍在数相同的有多少个。

classSolution {
public:
    intGetNumberOfK(vector<int> data ,int k){
        int start,end,mid,count=0,i;
        unsignedint len = data.size();
        if(!len)
            return0;
        start =0;
        end = len-1;
        mid = start;
        while(start<end)
        {
            mid = (start+end)/2;
            if(k >data[mid])
                start = mid+1;
            if(k<data[mid])
                end = mid-1;
            if(k==data[mid])
                break;
        }
        i=mid;
        while( (i>=0) && (k==data[i]))
        {
            i--;
            count++;
        }
        i=mid+1;
        while((i<len)&& (k==data[i]) )
        {
            i++;
            count++;
        }
        return count;
    }
};

十、剑指 Offer II 001. 整数除法(力扣

题目描述:给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 '*'、除号 '/' 以及求余符号 '%' 。

解题思路:使用减法代替除法。

classSolution {
    publicintdivide(int a, int b) {
        if(a==Integer.MIN_VALUE&&b==-1)
            return Integer.MAX_VALUE;
        int sign=((a>0)^(b>0))?-1:1;
        if(a>0)
            a=-a;
        if(b>0)
            b=-b;
        int res=0;
        while(a<=b){
            a-=b;
            res++;
        }
        return sign==1?res:-res;
    }
}

十一、剑指 Offer II 006. 排序数组中两个数字之和

思路:使用二分查找

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        for(int i=0;i<numbers.length;i++){
            int left=i+1,right=numbers.length-1;
            while(left<=right){
                int mid=(left+right)/2;
                if(target-numbers[i]==numbers[mid]){
                    return new int[]{i,mid};
                }
                if(target-numbers[i]<numbers[mid]){
                    right=mid-1;
                }
                else{
                    left=mid+1;
                }
            }
            
        }
        return new int[]{-1,-1};
    }
}

十二、三数之和

思路:排序+双指针

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int len=nums.length;
        Arrays.sort(nums);
        List<List<Integer>>res=new ArrayList<>();
        for(int first=0;first<len;first++){
            if(first>0&&nums[first]==nums[first-1]){
                continue;
            }
            int target=-nums[first];
            int third=len-1;
            for(int second=first+1;second<len;second++){
                if(second>first+1&&nums[second]==nums[second-1])
                    continue;
                while(second<third &&nums[second]+nums[third]>target){
                    third--;
                }
                if(second==third){
                    break;
                }
                if(nums[second]+nums[third]==target){
                    res.add(Arrays.asList(nums[first],nums[second],nums[third]));
                }
            }
        }
        return res;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组 的相关文章

  • BYOL算法笔记

    论文 xff1a Bootstrap your own latent A new approach to self supervised Learning 链接 xff1a https arxiv org abs 2006 07733 代码
  • softmax,softmax-loss,BP的解释

    本文转载自 xff1a http freemind pluskid org machine learning softmax vs softmax loss numerical stability xff0c 看完这个博客让我对softma
  • ResNeXt算法详解

    论文 xff1a Aggregated Residual Transformations for Deep Neural Networks 论文链接 xff1a https arxiv org abs 1611 05431 PyTorch代
  • YOLO(You Only Look Once)算法详解

    这篇博客主要介绍下YOLO v1算法 xff08 CVPR2016的文章 xff09 YOLO是目前比较流行的object detection算法 xff0c 速度快且结构简单 xff0c 其他的object detection算法如fas
  • FPN(feature pyramid networks)算法讲解

    这篇论文是CVPR2017年的文章 xff0c 采用特征金字塔做目标检测 xff0c 有许多亮点 xff0c 特来分享 论文 xff1a feature pyramid networks for object detection 论文链接
  • DenseNet算法详解

    论文 xff1a Densely Connected Convolutional Networks 论文链接 xff1a https arxiv org pdf 1608 06993 pdf 代码的github链接 xff1a https
  • linux网关下的TC控速

    控制上传下载速度理论方面的相关记录 1 对于TC限速配置方面 xff0c 最关键的要明白 xff0c TC限速实际上是在分析每个经过的IP数据包 xff0c 根据我们给定的限速规则 xff0c 将不同的IP数据包归入到不同的分类中 xff0
  • July 17th 模拟赛C T3 Circle Solution

    空降题目处 外网 点我点我点我 空降题目处 内网 点我点我点我 Description 给定三个点 xff08 不共线 xff09 的坐标 xff0c 要求以这三个点为圆心做三个圆 xff0c 圆两两不相交 xff0c 不包含 xff0c
  • 损失函数改进之Large-Margin Softmax Loss

    最近几年网络效果的提升除了改变网络结构外 xff0c 还有一群人在研究损失层的改进 xff0c 这篇博文要介绍的就是较为新颖的Large Margin softmax loss xff08 L softmax loss xff09 Larg
  • 卷积神经网络系列之softmax,softmax loss和cross entropy的讲解

    我们知道卷积神经网络 xff08 CNN xff09 在图像领域的应用已经非常广泛了 xff0c 一般一个CNN网络主要包含卷积层 xff0c 池化层 xff08 pooling xff09 xff0c 全连接层 xff0c 损失层等 虽然
  • XNOR-Net算法详解

    论文 xff1a XNOR Net ImageNet Classification Using Binary Convolutional Neural Networks 链接 xff1a https arxiv org abs 1603 0
  • PyTorch源码解读之torch.utils.data.DataLoader

    PyTorch中数据读取的一个重要接口是torch utils data DataLoader xff0c 该接口定义在dataloader py脚本中 xff0c 只要是用PyTorch来训练模型基本都会用到该接口 xff0c 该接口主要
  • PANet算法笔记

    论文 xff1a Path Aggregation Network for Instance Segmentation 论文链接 xff1a https arxiv org abs 1803 01534 这篇是CVPR2018关于实例分割
  • Ubuntu 18.04 LTS安装vncserver虚拟网络控制台

    虚拟网络控制台 xff08 VNC xff09 是一个图形桌面共享软件 xff0c 允许您使用键盘和鼠标远程控制另一台计算机 系统环境 服务端 xff1a Ubuntu 18 04 Server LTS客户端 xff1a Windows10
  • 轻松使用 Debian的Linux

    Spiral Linux 就是这样一种发行版 xff0c 它源于 Debian 它的重点在于促进简单性并为最终用户提供开箱即用的特性和功能 如果您是开源操作系统的新手 xff0c 并且想熟悉一个易于使用的 Linux 发行版 xff0c 那
  • 手残也不该敲的命令

    Linux命令是一种很有趣且有用的东西 xff0c 但在你不知道会带来什么后果的时候 xff0c 它又会显得非常危险 所以 xff0c 在输入某些命令前 xff0c 请多多检查再敲回车 rm rf rm rf是删除文件夹和里面附带内容的一种
  • Linux 基金会宣布成立 TLA+ 语言基金会

    Linux 基金会宣布成立 TLA 43 基金会 TLAF xff0c 以促进 TLA 43 编程语言及其 TLA 43 从业者社区的采用和发展 TLA 43 基金会的创始成员包括 AWS 甲骨文和微软 TLA 43 Temporal Lo
  • Linux的这七大认识误区,你千万别有!

    本文罗列了大家对Linux的七大认识误区 xff0c 看看其中那个是你也出现过的 千万别让这些先入为主的观点断送了你体验新事物的机会 Linux的受众群体并不大 对还是错 错 xff01 大错而特错 我承认 xff0c Linux的实际用户
  • oracle隔离级别深究追根

    oracle数据库 xff0c 只有两种隔离级别 xff1a read committed和serializable 简单的说 xff0c read committed是语句级隔离 xff0c serializable是事务级隔离 xff0
  • Solus Linux 改变发展方向

    Solus 是一个独立开发的 Linux 发行版 xff0c 它的一大特色就是 Solus 自创的 Budgie 桌面环境 xff08 最新的 Fedora 也已经新增了这个桌面环境 xff09 xff0c 当然用户也可以选择其他常见的 G

随机推荐

  • uptime 命令介绍

    Linux 小白 xff0c 若对系统管理有兴趣 xff0c 或想成为资深用户 xff0c 就需要对命令行有扎实的功底 你需要知道很多命令 xff0c 其中一个就是 uptime 文本我们会通过一些容易理解的案例来讲解一下这个命令的基本用法
  • 解决CentOS添加新网卡后找不到网卡配置文件

    使用VMware Workstation虚拟机安装好CentOS7虚拟机后 xff0c 添加网卡后CentOS 7无网卡配置文件的问题 xff0c 添加第二块网卡以后 xff0c 进入CentOS 7系统后 xff0c 看不到网卡配置文件
  • 详解将FTP映射至Windows

    在经常使用ftp传输文件的环境中 xff0c 每次上传和下载文件都需要重新连接然后登录是非常繁琐的一件事情 我们可以将FTP空间映射到本地磁盘空间 xff0c 免去输入地址以及账号 密码 方便我们日常中文件的上传和下载 1 双机桌面上的我的
  • Secure Boot什么意思?BIOS中Secure Boot灰色无法更改解决方法详解

    在电脑Bios设置中 xff0c 有一项 Secure Boot 相关设置 xff0c 很多朋友不知道Secure Boot什么意思 xff0c 也不知道该如何设置 下面本文就来谈谈Secure Boot设置相关的知识 xff0c 需要的朋
  • centos7 RAID磁盘阵列卡驱动安装图文教程

    解决方案 本方案可以支持centos7版本 UEFI模式 选择 Install CentOS Linux 7 xff0c 然后按 e 键 选择添加 linux dd xff0c 然后按 Ctrl 43 x 启动 进入如下图 虚拟光驱弹出系统
  • ubuntu 12.04 配置Ralink corp. RT3290 Wireless 802.11n 1T/1R PCIe无线网卡

    03 00 0 Network controller Ralink corp RT3290 Wireless 802 11n 1T 1R PCIe Subsystem Hewlett Packard Company Device 18ec
  • badblocks检查磁盘坏道

    参 数 功 能 s 显示检查进度 v 运行时显示详细的处理信息 w 做写入检测 root 64 localhost badblocks s dev sda2 Checking for bad blocks read only test do
  • 自协商(802.3)原理浅析

    题注 xff1a 在阅读过网上关于自协商的介绍文章 xff0c 在此针对阅读中遇到的疑问进行简单记录和分析 xff01 Q1 网络通信链路空闲时 xff0c 链路上固定发送检测脉冲的是TX 43 xff0c TX xff0c RX 43 x
  • ubuntu安装时姓名、计算机名、用户名的含义

    如有问题 xff0c 请加扣扣群 xff1a 460189483 ubuntu安装时 xff0c 最后一步是设置姓名 计算机名 用户名 xff0c 那么这些名字是什么意思 xff1f 之后又有什么作用呢 xff1f 下面来详解一下 安装最后
  • PB关于数据窗口内字段值改变问题

    1 在创建DW时 xff0c 如果使用select办法 xff0c 并且只查询一张表的话 xff0c PB默认自动提供修改其值 xff0c 程序运行后 xff0c 可以在DW控件内直接修改字段值 xff0c 当然如果要保存数据的话 xff0
  • 我的2016——培训、工作,回首大学

    我是一名计算机专业的本科生 xff0c 2016年7月到12月期间 xff0c 参加专业技能培训学习 在此期间接触一些其他高校的学生 xff0c 我和他们接触期间 xff0c 结合实际情况 xff0c 有以下感想 xff1a 1 在大学期间
  • ADSL Server出错解决一例(战神攻击)

    ADSL Server出现如下大量提示 var log messages Mar 19 16 36 43 ADSLserver kernel ll header ff ff ff ff ff ff 00 48 54 5b 0d 3f 08
  • uboot sf 命令用法

    转自 xff1a https blog csdn net kickxxx article details 56012456 uboot中如果支持spi qspi flash 那么可以使用sf的erase read write命令操作spi
  • 灰度共生(共现)矩阵的求法

    前段时间在写关于图像的作业时 xff0c 出现了灰度共生矩阵的求法问题 于是就上网查资料发现不是很理想 xff0c 翻书查阅也是不同的书籍出现的解法也是不一样 xff0c 上别的课时老师也给我们讲了下 xff0c 但是发现与我所看到的资料上
  • Qt调试问题记录(持续更新)

    目录 前言调试平台调试记录configure报C 43 43 11缺失g 43 43 编译选项不支持 前言 本人调试Qt所遇到的问题均会记录在此 xff0c 方便回溯 调试平台 Qt版本 xff1a 5 12 11Host PC xff1a
  • websocket autobahn jar包的用法

    autobahn 0 5 0 jar 文件的地址 xff1a http pan baidu com s 1slQYcKP 使用websocket好简单方便 xff0c 据一天来我们公司的大神说 xff1a websocket是封装好的成熟的
  • Linux中vnc的配置端口号的修改

    vnc的默认端口是自己配置的 xff0c 并不是这有一个端口号 通过打开 etc sysconfig vncservers 这里就配置了2个桌面 xff0c 一个桌面号是1 xff0c 一个是2 这里的配置的参数 VNCSERVERS 61
  • oracle的sql查询分析函数-高级部分-分析函授over()子句

    oracle的分析函数 xff0c 应该是有一个格式的 function argu1 argu2 over partition by order by windowing clause 这是一个完整的分析函数的格式 我之前用的分析函数 xf
  • 使用docker搭建鸿蒙开发环境

    第一步下载docker https docs docker com engine install windows 版本https desktop docker com win stable amd64 Docker 20Desktop 20
  • 数组

    一 数组中重复的数字 题目描述 xff1a 在一个长度为n的数组里的所有数字都在0到n 1的范围内 数组中某些数字是重复的 xff0c 但不知道有几个数字是重复的 也不知道每个数字重复几次 请找出数组中任意一个重复的数字 例如 xff0c