Longest Increasing Subsequence
给定一个无序的整数数组,找到其中最长上升子序列的长度。
示例:
输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。
说明:
- 可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。
- 你算法的时间复杂度应该为 O(n2) 。
进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?
代码:
class Solution:
def lengthOfLIS(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
#### the first method , have not passed
# if nums == []:
# return 0
# count = 1
# res = [1] * len(nums)
# for i in range(0, len(nums) -1):
# if nums[i] < nums[i+1]:
# count += 1
# else:
# res.append(count)
# return max(res)
#### the second method, 超出时间限制
# if nums == []:
# return 0
# dp = [1] * len(nums)
# for i in range(len(nums)):
# for j in range(i):
# if nums[i] > nums[j]:
# dp[i] = max(dp[i], dp[j]+1)
# return max(dp)
#### the third method
res = []
for i in range(len(nums)):
left, right = 0, len(res)-1
while left <= right:
mid = left + (right - left) // 2
if res[mid] < nums[i]:
left = mid + 1
else:
right = mid - 1
if left >= len(res):
res.append(nums[i])
else:
res[left] = nums[i]
return len(res)
202. 快乐数
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
示例:
输入: 19 输出: true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
class Solution:
def isHappy(self, n):
"""
:type n: int
:rtype: bool
"""
def getsum(x):
sum = 0
while x:
sum += (x % 10) **2
x = x // 10
return sum
if n <= 0:
return False
while n != 1:
n = getsum(n)
if n == 4:
return False
return True