leetcode刷题-数组篇

                                                 数组篇
  1. 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。

解法:遍历整个数组,如果数组中出现大于等于这个目标值的元素,则直接返回该数组中这个元素的索引值,否则该数组所有元素均小于目标值,返回数组的长度。

在这里插入图片描述

  1. 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

解法:动态规划。

状态转移方程:dp[i] = max(dp[i-1] + num[i], num[i])

          res = max[res, dp[i]]

设置子序列和的最大值res,随时更新,如果前n个元素的和小于0,那么它的和加上下一个元素必定小于从下一个元素重新开始计数的值。

贴一段标准动态规划的代码:

在这里插入图片描述

这种方法更直接一点,直接判断前面几个元素的和是否大于零,大于零,则继续相加,否则重新开始计数。

在这里插入图片描述

  1. 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。

解法:真的是看了解答才清楚这个题目的意图,示例中没有给到9这个元素的实例。可以从数组的最后一个元素往前遍历,如果这个数字不是9,那么直接将这个元素加1,然后返回该数组即可;如果这个数字是9的话,那么将这个元素加1,然后置为0,当整个数组遍历结束的时候,如果依旧没有返回值,那么说明这个数组的元素全为9,这时新建一个比原数组长1的新数组,将这个新数组的第一个元素置为1,其他的均为0.

贴上一个C++的解法,顺便巩固一下vector这个容器的操作,刚开始想新建一个vector,第一个元素为0,循环n次去push_back 0这个元素,简直太蠢了,直接利用vector的insert函数在首位插入即可。
在这里插入图片描述

  1. 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

解法:1.由于是两个排序数组,这里可以使用双指针来进行求解,如果从数组的第0个元素遍历到m-1个元素的话,需要额外申请一个长度为m的数组来临时保存nums1数组,此时的时间复杂度为O(m+n),空间复杂度为O(m)。

2.这时建议从数组的最后一个元素来遍历,这样不用额外申请一个长度为m的数组,数组总长度为m+n,时间复杂度为O(m+n),将两个数组中较大的元素以此从数组的最后一个元素往前填,有较大元素数组的指针作相应变化。
在这里插入图片描述

  1. 两数之和
    II - 输入有序数组

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

函数应该返回这两个下标值 index1 和 index2,其中
index1 必须小于 index2。

说明:

返回的下标值(index1 和 index2)不是从零开始的。

你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

解法:这题就比较简单了,数组为有序数组,典型的双指针题目,用C++的vector分别从0和n-1开始,注意—最终返回的值是从1开始到n,如果存在这样的两个数,这两个数的索引要分别加上1。具体解析一下:如果两数之和等于目标数,则push_back这两个元素的索引加1值,如果两数之和大于目标数,那么index2-1,如果小于目标数,那么index1+1。

在这里插入图片描述

  1. 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 n/2 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。

解法:1.第一种:可以通过对数组进行排序,排序后的数组中位数的值即次数大于n/2的元素。

2.第二种:leetcode上有一种解释很形象:可以看成是若干支军队争夺一个高地,总人数为n,其中有一个军队很强,总人数超过了n/2,这样即使进行一对一的消耗,最后留下来的一定是这个总人数超过n/2的军队。这种算法的时间复杂度为O(n),先将数组的第一个元素设置为这个多数元素,同时设置计数,如果后一个元素和前一个元素相同,那么计数值加1,否则计数值减1,当计数值小于等于0的时候,将这个多数元素的值设置为后一个元素的值,贴一个C++的解法:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值