lintcode入门篇三
一. 两数之和
给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
你需要实现的函数twoSum
需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1。
样例
Example1:
给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1].
Example2:
给出 numbers = [15, 2, 7, 11], target = 9, 返回 [1, 2].
挑战
Either of the following solutions are acceptable:
- O(n) Space, O(nlogn) Time
- O(n) Space, O(n) Time
注意事项
你可以假设只有一组答案。
第一种解法:
class Solution: """ @param numbers: An array of Integer @param target: target = numbers[index1] + numbers[index2] @return: [index1, index2] (index1 < index2) """ def twoSum(self, numbers, target): # write your code here array = [] for i in range(len(numbers)): for j in range(i + 1,len(numbers)): if numbers[i] + numbers[j] == target: return [i,j]
第二种解法:
class Solution: """ @param numbers: An array of Integer @param target: target = numbers[index1] + numbers[index2] @return: [index1, index2] (index1 < index2) """ def twoSum(self, numbers, target): # write your code here for i in range(len(numbers)): s = target - numbers[i] if s in numbers and numbers.index(s) != i: if numbers.index(s) > i: return [i,numbers.index(s)] else: return [numbers.index(s),i]
二. 搜索插入位置
中文English
给定一个排序数组和一个目标值,如果在数组中找到目标值则返回索引。如果没有,返回到它将会被按顺序插入的位置。
你可以假设在数组中无重复元素。
样例
[1,3,5,6],5 → 2
[1,3,5,6],2 → 1
[1,3,5,6], 7 → 4
[1,3,5,6],0 → 0
挑战
时间复杂度为O(log(n))
class Solution: """ @param A: an integer sorted array @param target: an integer to be inserted @return: An integer """ def searchInsert(self, A, target): # write your code here if target in A: return A.index(target) else: for i in range(len(A)): if A[i] > target: return i return len(A)
注释:
1.如果target在A数组里面,返回index。
2.如果不在A数组里面,则返回插入数组的位置。if A[i] > target >> return i,否则的话,说明是比A数组全部的值都大,则插入到A数组最后一个位置,即len(A)。
三. 爬楼梯
假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
样例
Example 1:
Input: n = 3
Output: 3
Explanation:
1) 1, 1, 1
2) 1, 2
3) 2, 1
total 3.
class Solution: """ @param n: An integer @return: An integer """ def climbStairs(self, n): # write your code here ''' 思路: 1.如果n=0的话,则0种方法 2.如果n>0的话 n = 1 1 n = 2 2 n = 3 3 1+2 n = 4 5 2+3 n = 5 8 3+5 如果是到第5级的话,一步到位的有两种可能,要么是从第4级上来,要么是从第3级上来。 到第4级多少种方法 + 到第3级多少种方法 = 到第5级多少种方法 即f(n) = f(n-1) + f(n-2) ''' if n == 0: return 0 a = 0 b = 1 for i in range(n): c = a + b a = b b = c return c