bat从数组中找出相同数字并删除_LeetCode in python简单题--数组篇

1.两数之和

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

26. 删除排序数组中的重复项

27. 移除元素

66. 加一

88. 合并两个有序数组

118. 杨辉三角

119. 杨辉三角II

121. 买卖股票的最佳时机

122. 买卖股票的最佳时机 II

169. 求众数

189.旋转数组

1. 两数之和

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

代码:

解法1:暴力解法,双重循环

class 

解法2:一次循环,看target-nums[i]在不在数组中。

class 

解法3:可以借用哈希(Python 叫字典),我们遍历元素的时候,且记录元素的下标,当我们找 target-a 时候,只需要在字典找,就可以了,查找字典时间复杂度为 O(1)O(1)。

class 

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

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

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

说明:

  • 返回的下标值(index1 和 index2)不是从零开始的。
  • 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

示例:

输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。

思路

左右两个指针移动,sum等于左右两个元素的和,sum和target比较,当sum小于target时,start往右走,当sum大于target的时候,end往左走。

代码

class 

26. 删除排序数组中的重复项

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 :

给定数组 nums = [1,1,2], 
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

说明:

为什么返回数值是整数,但输出的答案是数组呢?

请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:

// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝

思路:借助一个计数变量:count,初始化为0,用nums[count]和array中的数字比较,当不同的时候,count加1,且将这个不同的数字置为nums[count]。

代码:

class 

27. 移除元素

给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 :

给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。

思路:

定义首尾两个指针,当首部指针对应的元素是需要删除的元素时,和最后一个元素交换,使尾部指针减1实现删除元素,如果不需要删,则将首部指针加1.最后返回last+1即删除后array的长度。

代码:

class 

66. 加一

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 :

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。

代码

class 

88. 合并两个有序数组

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

初始化 nums1 和 nums2 的元素数量分别为 m 和 n。

你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3
输出: [1,2,2,3,5,6]

思路

设置两个指针,从尾部开始比较,较大的数字放在最后,对应的指针减1;若nums2的指针在nums1的指针为0时仍不为0,那么说明这个指针之前的数字都比nums1的最小数字还要小,所以直接添加到nums1的前面

代码

class 

118. 杨辉三角

给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。

780265c192f891af3530ce93340131fd.png

在杨辉三角中,每个数是它左上方和右上方的数的和。

示例:

输入: 5
输出:
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]

代码:

class 

119. 杨辉三角 II

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。

示例:

输入: 3
输出: [1,3,3,1]

代码

class 

121. 买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。

注意你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。

示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

思路:动态规划解法,最大利润= max(前一天最大利润, 今天的价格 - 之前最低价格)

代码

class 

122. 买卖股票的最佳时机 II

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。

示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。

思路

若连续上涨,第一天买最后一天卖收益最大;

若连续下降,不买卖,就不会亏钱。

赚到了所有交易日的钱,所有亏钱的交易日都未交易,理所当然会利益最大化。

total=prices[1]-prices[0]+prices[2]-prices[1]+prices[3]-prices[2]+prices[4]-prices[3]+prices[5]-prices[4]

消掉后,就只剩total=prices[5]-prices[0]

代码

class 

169. 求众数

给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在众数。

示例 1:

输入: [3,2,3]
输出: 3

示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

思路:1.排序后找中位数,两行代码:

nums

2.摩尔投票法(Boyer Moore投票法)

假设第一个数字是众数,遍历数组,若元素 == 当前众数res则count += 1,否则count -= 1;

在下次count == 0时,意味着当前众数res的数量为已遍历元素一半;这种情况下,剩余数组众数仍等于原数组众数(因为最坏的情况是已遍历数组中一半是数组众数,一半是非众数)。

因此,在每次count == 0时,记录当前数字为当前众数,当遍历完整个数组时,留下的res一定为整个数组的众数(最坏情况是在最后一个元素才找到众数,前面的count全部抵消)。

代码

class 

189. 旋转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右旋转 1 步: [7,1,2,3,4,5,6]
向右旋转 2 步: [6,7,1,2,3,4,5]
向右旋转 3 步: [5,6,7,1,2,3,4]

代码

class 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值