lintcode入门篇二
一. 最大子数组
给定一个整数数组,找到一个具有最大和的子数组,返回其最大和。
样例
样例1:
输入:[−2,2,−3,4,−1,2,1,−5,3]
输出:6
解释:符合要求的子数组为[4,−1,2,1],其最大和为 6。
样例2:
输入:[1,2,3,4]
输出:10
解释:符合要求的子数组为[1,2,3,4],其最大和为 10。
挑战
要求时间复杂度为O(n)
注意事项
子数组最少包含一个数
输入测试数据 (每行一个参数)如何理解测试数据?
第一种解法:O(n)时间复杂度
class Solution: """ @param nums: A list of integers @return: A integer indicate the sum of max subarray """ def maxSubArray(self, nums): # write your code here ''' 做两步判断: 1.第一步判断:当n > 0 的时候,继续加。如果n小于0,则n取最新的数,之前的舍弃 2.第二步判断:sum 和 继续加的n作比较,如果sum < n,那么sum = n,否则sum保持。 ''' sum = nums[0] n = nums[0] for i in range(1,len(nums)): if n > 0: n = n + nums[i] else: #一旦n < 0,舍弃,取新的值n进行继续相加 n = nums[i] if sum < n: sum = n return sum
第二种解法:O(n2)时间复杂度
def MaxSumArray(nums): ''' 1.取出所有符合条件的顺序数组 2.然后将所有顺序数组的值放在一个大的数组[]里面,最后返回里面的最大值max :param nums: :return: ''' array = [] for i in range(len(nums)): for j in range(i + 1,len(nums)): array.append(sum(nums[i:j])) return max(array) result = MaxSumArray([-2,2,-3,4,-1,2,1,-5,3]) print(result)
二. 最小子数组
给定一个整数数组,找到一个具有最小和的连续子数组。返回其最小和。
样例
样例 1
输入:[1, -1, -2, 1]
输出:-3
样例 2
输入:[1, -1, -2, 1, -4]
输出:-6
注意事项
子数组最少包含一个数字
class Solution: """ @param: nums: a list of integers @return: A integer indicate the sum of minimum subarray """ def minSubArray(self, nums): # write your code here ''' 1.负数一直相加,一旦大于0,则被替换 2.sum 记录之前保存最小值的和,如果一旦有出现更小的和的话,则被替换 :param nums: :return: ''' n = nums[0] sum = nums[0] for i in range(1,len(nums)): if n < 0: n = n + nums[i] else: n = nums[i] if sum > n: sum = n return sum
三. 数组剔除元素后的乘积
中文English
给定一个整数数组A。
定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1]
, 计算B的时候请不要使用除法。请输出B。
样例
样例 1
输入: A = [1, 2, 3]
输出: [6, 3, 2]
解析:B[0] = A[1] * A[2] = 6; B[1] = A[0] * A[2] = 3; B[2] = A[0] * A[1] = 2
class Solution: """ @param: nums: Given an integers array A @return: A long long array B and B[i]= A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1] """ def productExcludeItself(self, nums): # write your code here array = [] for i in range(len(nums)): sum = 1 for j in range(len(nums)): if i != j: sum = sum * nums[j] array.append(sum) return array
四. 翻转字符串中的单词
给定一个字符串,逐个翻转字符串中的每个单词。
样例
样例 1:
输入: "the sky is blue"
输出: "blue is sky the"
样例解释:
返回逐字反转的字符串.
样例 2:
输入: "hello world"
输出: "world hello"
样例解释:
返回逐字反转的字符串
说明
- 单词的构成:无空格字母构成一个单词,有些单词末尾会带有标点符号
- 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
- 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
输入测试数据 (每行一个参数)如何理解测试数据?
输出: "world hello" 样例解释: 返回逐字反转的字符串.
说明
- 单词的构成:无空格字母构成一个单词,有些单词末尾会带有标点符号
- 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
- 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
class Solution: """ @param: s: A string @return: A string """ def reverseWords(self, s): # write your code here array = s.split(' ') new_s = '' for i in range(len(array)): if array[i] != '': new_s = array[i] + ' ' + new_s return new_s
注释:
1.'hello word xiao li '.split(' ') 结果为['hello','',world','','','xiao','','li','']
五. 比较字符串
比较两个字符串A和B,确定A中是否包含B中所有的字符。字符串A和B中的字符都是 大写字母
样例
给出 A = "ABCD"
B = "ACD"
,返回 true
给出 A = "ABCD"
B = "AABC"
, 返回 false
注意事项
在 A 中出现的 B 字符串里的字符不需要连续或者有序。
class Solution: """ @param A: A string @param B: A string @return: if string A contains all of the characters in B return true else return false """ def compareStrings(self, A, B): # write your code here for n in B: if n not in A: return False A = A.replace(n,'',1) ##每次校验完之后,要去除掉首个校验通过的字符(即校验在A里面的字符,字符位置不固定,但固定是首次出现的字符) return True
注释:
对于A,B分别为'ABCD'和'AACD'的特殊情况,如果每次判断完,不进行去除的话,则会返回True。只有每次判断完,之后去除掉当前的首个判断成功的字符,才可以正确判断出结果。