268,283,414,448,485,532,561
268:缺失正数
题目描述:
给定一个包含 0, 1, 2, …, n 中 n 个数的序列,找出 0 … n 中没有出现在序列中的那个数。
思路:
1:(首项+尾项)**项数//2) 减去 数组总和
2:哈希表比对值和下标是否对应
代码:
class Solution(object):
def missingNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
b=[]
for i in range(len(nums)):
b.append(i)
a=dict.fromkeys(b,'a')
for i in range(len(nums)):
if nums[i] in a:
a[nums[i]]=nums[i]
for i in range(len(nums)):
if a[i]!=i:
return i
return i+1
283:移动零
题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
思路:
定义两个指针i,j,然后遍历数组,i跟j同时往前走,当遇到0时j停下,i继续往前走,当nums[i]不为0时则将num[i]的元素赋给j的位置,j++,nums[i]被赋值为0。
可以先把所有非0的元素移到前面,然后将后面的位置补0
代码:
class Solution(object):
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: None Do not return anything, modify nums in-place instead.
"""
i=0
j=0
for n in nums:
if n!=0:
nums[j]=n
j+=1
while j < len(nums):
nums[j]=0
j+=1
return nums
414:第三大的数
题目描述:
给定一个非空数组,返回此数组中第三大的数,如果不存在,则返回数组中最大的数。
思路:
用first, second, third分别保存最大,次大和第三大的数
遍历数组,并将其与first,second,third比较,判断是否需要更新
最后得到第三大的元素,若没有则返回第一大的元素。
代码:
class Solution(object):
def thirdMax(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
max1 = None
max2 = None
max3 = None
for i in nums:
if i == max1 or i == max2 or i == max3:
continue
if max1 == None or i > max1:
max3 = max2
max2 = max1
max1 = i
elif max2 == None or i > max2:
max3 = max2
max2 = i
elif max3 == None or i > max3:
max3 = i
if max3 == None:
return max1
else:
return max3
448:
题目描述:
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。
思路:
1:将每个数字放到正确的位置上(对应的下标)。若当前位置的元素不等于i+1,将它放到对应的下标nums[i]−1处。再遍历一次数组,那么位置上不是对应的数时,即为缺失的数字
2:
代码:
class Solution(object):
def findDisappearedNumbers(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
for i in range(len(nums)):
while nums[i]!=i+1:
temp=nums[nums[i]-1]
nums[nums[i]-1]=nums[i]
nums[i]=temp
if nums[nums[i]-1]==nums[i]:
break
res=[]
for i in range(len(nums)):
if nums[i]!=i+1:
res.append(i+1)
print(nums)
return res
485:最大连续1的个数
题目描述:
给定一个二进制数组, 计算其中最大连续1的个数。
思路:
指针指向子序列的第一个1的位置,当nums[i]为0时,指针指向i的下一个位置,直到出现下一个连续子序列。
代码:
class Solution(object):
def findMaxConsecutiveOnes(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
max1=0
i=0
a=0
while i < len(nums):
if nums[i]==1:
a+=1
i+=1
if a>max1:
max1=a
else:
a=0
i+=1
continue
return max1
532:数组中的K-diff数对
题目描述:
给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i 和 j 都是数组中的数字,且两数之差的绝对值是 k.
思路:
1、先把数组排序
2、依次计算相邻两个数的绝对值是否等于 k
2-1:如果等于k
2-1-1:判断i 是否等于0,如果等于直接sum++
2-1-2:因为是经过排序了,而且(1,3)和(3,1)算一种,所以每次
绝对值等于K的时候 都要判断nums[i] 是否等于nums[i+1]
2-2:小于k,继续循环
2-3:大于k结束循环,(经过排序了,当前大于k,后面只能更大于k)
代码:
class Solution(object):
def findPairs(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
size=len(nums)
if size==0:
return 0
nums.sort()
sum=0
for i in range(size):
if i>0 and nums[i]==nums[i-1]:
continue
for j in range(i+1,size):
if nums[j]-nums[i]==k:
sum+=1
break
elif nums[j]-nums[i]>k:
break
return sum
561:数组拆分Ⅰ
题目描述:
给定长度为 2n 的数组, 你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), …, (an, bn) ,使得从1 到 n 的 min(ai, bi) 总和最大。
思路:
选择配对中最小值的操作,比如 (a,b)可能会产生的最大损失 a−b (如果 a>b)。如果这类配对产生的总损失最小化,那么总和现在将达到最大值。只有当为配对选择的数字比数组的其他元素更接近彼此时,才有可能将每个配对中的损失最小化。
所以排序,将奇数位相加。
代码:
nums.sort()
return sum(nums[::2])