26.删除排序数组中的重复项
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
思考:
由于是排序数组,所以重复的元素必定是相邻的,那么从数组第一个元素下标0开始,依次查找其下一个元素,检查是否相等,若相等即删除该元素,若不等则下标+1。
代码如下:
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
i=0
while i<len(nums)-1:
if nums[i]==nums[i+1]:
nums.remove(nums[i])
else:
i+=1
return len(nums)
27.移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
思考:
使用list.pop()的方法,将查询出的重复元素弹出,由于数组的长度随时在变化,故使用while比for进行循环更好,for比较适合list长度固定时使用。
代码如下:
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
l=len(nums)
i=0
if l==0:
return 0
while i<l:
if nums[i]==val:
nums.pop(i)
l-=1
else:
i+=1
return len(nums)
35.搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
思考:
利用二分查找思想,判断中间值mid上的数与target的大小:
若大于target,则说明target在left与mid之间,令right值更新为mid
若小于target,则说明target在mid和right之间,令left值更新为mid+1
若等于target,则直接返回mid;
mid使用由left+(right-left)//2得到可防止right+left过大导致溢出,同时,在python//返回的是整数,而/返回的是浮点数。
代码如下:
class Solution(object):
def searchInsert(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
left=0
right=len(nums)
while left<right:
mid=left+(right-left)//2
if nums[mid]>target:
right=mid
elif nums[mid]<target:
left=mid+1
else:
return mid
return left
53.最大子序和
给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
思考:
使用动态规划寻找最优子结构,令sum=0,数组第一个数为maxsum,从左往右每个元素依次相加,一旦sum大于maxsum,即令maxsum=sum,一旦sum<0,则令sum初始化为0,因为前面元素和为负数,最大子序列和肯定不能包含前面部分。
代码如下:
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
sum=0
MAXSUM=nums[0]
for i in range(len(nums)):
sum+=nums[i]
if sum > MAXSUM:
MAXSUM=sum
if sum<0:
sum=0
return MAXSUM
66.加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
思考:因为单独考虑最后一个元素是否为9太过繁琐,我的做法是先将数组上各个数用字符串提取,将字符串转化为int型做+1,然后再将其通过字符串转化为数组。
代码如下:
class Solution(object):
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
s=' '
for i in digits:
s+=str(i)
s=int(s)+1
x=[]
for i in str(s):
x.append(int(i))
return x
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]
思考:
该题可以使用双指针,我用的方法是直接合并两个数组再sort。
代码如下:
class Solution(object):
def merge(self, nums1, m, nums2, n):
"""
:type nums1: List[int]
:type m: int
:type nums2: List[int]
:type n: int
:rtype: void Do not return anything, modify nums1 in-place instead.
"""
nums1[m:n+m]=nums2[:n]
nums1.sort()
118.杨辉三角
给定一个非负整数 numRows,生成杨辉三角的前 numRows 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 5
输出:
[
[1],
[1,1],
[1,2,1],
[1,3,3,1],
[1,4,6,4,1]
]
思考:
先初始化生成第N行的N个元素,观察可知,每一个元素都是由其上一行对应位置的元素与上一行前一位置的元素相加得到。
代码如下:
class Solution(object):
def generate(self, numRows):
"""
:type numRows: int
:rtype: List[List[int]]
"""
res=[]
for i in range(numRows):
temp=[1]*(i+1)
res.append(temp)
for j in range(1,i):
res[i][j]=res[i-1][j-1]+res[i-1][j]
return res
119.杨辉三角2
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
进阶:
你可以优化你的算法到 O(k) 空间复杂度吗?
思路:
先求出杨辉三角,再返回其第k行,需要注意的索引是第0行开始的,那么k<=33,即总共有34行,若为33行边界会报错。
代码如下:
class Solution(object):
def getRow(self, rowIndex):
"""
:type rowIndex: int
:rtype: List[int]
"""
if rowIndex<=33:
res=[]
for i in range(rowIndex+1):
temp=[1]*(i+1)
res.append(temp)
for j in range(1,i):
res[i][j]=res[i-1][j-1]+res[i-1][j]
return res[rowIndex]
else:
return false
121.买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
注意你不能在买入股票前卖出股票。
示例 1:
输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
思考:该题可简化为寻找某一元素,其后存在一个元素减去该元素的差值最大。
使用min_Price保存最小价格,使用max_Profit保存最大利润。
代码如下:
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if len(prices)<2:
return 0
min_Price=prices[0]
max_Profit=0
for i in range(len(prices)):
min_Price=min(min_Price,prices[i])
max_Profit=max(max_Profit,prices[i]-min_Price)
return max_Profit
122.买卖股票的最佳时期2
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
思考:
该题可以看作求每个元素与其后一个元素的差值,若为正,则累计。如[1,2,3],从第一天买入,第二天卖出,第二天在买入,第三天卖出,利润与第一天买入,第三天卖出一致。
代码如下:
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
if len(prices)<2:
return 0
profit=0
for i in range(1,len(prices)):
profit=profit+max(prices[i]-prices[i-1],0)
return profit