【leetcode】数组类——基础——提高题目
序号 | 题目 | 难度 | 代码 |
---|---|---|---|
4 | Median of Two Sorted Arrays | Hard | python、java、c++ |
289 | Game of Life | Medium | python、java、c++ |
4. Median of Two Sorted Arrays
There are two sorted arrays nums1 and nums2 of size m and n respectively.
Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
nums = sorted(nums1 + nums2)
mid_num = 0
if len(nums) % 2 == 0:
mid_num = float((nums[len(nums) // 2 - 1] + nums[len(nums) // 2]) / 2)
else:
mid_num = float(nums[len(nums) // 2])
return mid_num
289. Game of Life
According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970."
Given a board with m by n cells, each cell has an initial state live (1) or dead (0). Each cell interacts with its eight neighbors (horizontal, vertical, diagonal) using the following four rules (taken from the above Wikipedia article):
- Any live cell with fewer than two live neighbors dies, as if caused by under-population.
- Any live cell with two or three live neighbors lives on to the next generation.
- Any live cell with more than three live neighbors dies, as if by over-population..
- Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.
Write a function to compute the next state (after one update) of the board given its current state. The next state is created by applying the above rules simultaneously to every cell in the current state, where births and deaths occur simultaneously.
Example:
Input:
[
[0,1,0],
[0,0,1],
[1,1,1],
[0,0,0]
]
Output:
[
[0,0,0],
[1,0,1],
[0,1,1],
[0,1,0]
]
Follow up:
- Could you solve it in-place? Remember that the board needs to be updated at the same time: You cannot update some cells first and then use their updated values to update other cells.
- In this question, we represent the board using a 2D array. In principle, the board is infinite, which would cause problems when the active area encroaches the border of the array. How would you address these problems?
class Solution:
def gameOfLife(self, board: List[List[int]]) -> None:
"""
Do not return anything, modify board in-place instead.
"""
m, n = len(board), len(board[0])
if m == 0 or n == 0:
return
for iM in range(m):
for iN in range(n):
numNeighbor = sum([board[i][j]%2 for i in range(iM-1,iM+2) for j in range(iN-1,iN+2) if 0 <= i < m and 0<= j < n]) - board[iM][iN]
if board[iM][iN] == 0 and numNeighbor == 3:
board[iM][iN] = 2
if board[iM][iN] == 1 and ( numNeighbor < 2 or numNeighbor > 3):
board[iM][iN] = 3
for iM in range(m):
for iN in range(n):
if board[iM][iN] == 2:
board[iM][iN] = 1
if board[iM][iN] == 3:
board[iM][iN] = 0
【leetcode】数组类——基础——综合题
序号 | 题目 | 难度 | 代码 |
---|---|---|---|
274 | H-Index | medium | python、java、c++ |
376 | Wiggle Subsequence | medium | python、java、c++ |
277 | Find the Celebrity | medium | python、java、c++ |
370 | Range Addition | medium | python、java、c++ |
296 | Best Meeting Point | hard | python、java、c++ |
274. H-Index
Given an array of citations (each citation is a non-negative integer) of a researcher, write a function to compute the researcher's h-index.
According to the definition of h-index on Wikipedia: "A scientist has index h if h of his/her N papers have at least h citations each, and the other N − h papers have no more than h citations each."
Example:
Input: citations = [3,0,6,1,5]
Output: 3
Explanation: [3,0,6,1,5] means the researcher has 5 papers in total and each of them had received 3, 0, 6, 1, 5 citations respectively.
Since the researcher has 3 papers with at least 3 citations each and the remaining two with no more than 3 citations each, her h-index is 3.
Note: If there are several possible values for h, the maximum one is taken as the h-index.
class Solution:
def hIndex(self, citations: List[int]) -> int:
n = len(citations)
citations.sort()
result = 0
for h in range(1,n+1):
cnt = 0
for i in range(n):
if citations[i] >= h:
cnt += 1
if cnt >= h:
result = max(h,result)
return result
376. Wiggle Subsequence
A sequence of numbers is called a wiggle sequence if the differences between successive numbers strictly alternate between positive and negative. The first difference (if one exists) may be either positive or negative. A sequence with fewer than two elements is trivially a wiggle sequence.
For example, [1,7,4,9,2,5]
is a wiggle sequence because the differences (6,-3,5,-7,3)
are alternately positive and negative. In contrast, [1,4,7,2,5]
and [1,7,4,5,5]
are not wiggle sequences, the first because its first two differences are positive and the second because its last difference is zero.
Given a sequence of integers, return the length of the longest subsequence that is a wiggle sequence. A subsequence is obtained by deleting some number of elements (eventually, also zero) from the original sequence, leaving the remaining elements in their original order.
Example 1:
Input: [1,7,4,9,2,5]
Output: 6
Explanation: The entire sequence is a wiggle sequence.
Example 2:
Input: [1,17,5,10,13,15,10,5,16,8]
Output: 7
Explanation: There are several subsequences that achieve this length. One is [1,17,10,13,10,16,8].
Example 3:
Input: [1,2,3,4,5,6,7,8,9]
Output: 2
Follow up:
Can you do it in O(n) time?
class Solution:
def wiggleMaxLength(self, nums: List[int]) -> int:
if not nums:
return 0
up = down = 0
for i in range(len(nums)):
if nums[i] > nums[i-1]:
up = down + 1
elif nums[i] < nums[i-1]:
down = up + 1
return max(up,down)
277.find-the-celebrity
Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist one celebrity. The definition of a celebrity is that all the other n - 1 people know him/her but he/she does not know any of them.
Now you want to find out who the celebrity is or verify that there is not one. The only thing you are allowed to do is to ask questions like: "Hi, A. Do you know B?" to get information of whether A knows B. You need to find out the celebrity (or verify there is not one) by asking as few questions as possible (in the asymptotic sense).
You are given a helper function bool knows(a, b) which tells you whether A knows B. Implement a function int findCelebrity(n), your function should minimize the number of calls to knows.
Note: There will be exactly one celebrity if he/she is in the party. Return the celebrity's label if there is a celebrity in the party. If there is no celebrity, return -1.
class Solution(object):
def findCelebrity(self, n):
"""
:type n: int
:rtype: int
"""
cand = 0
for i in range(1, n):
if knows(cand, i):
cand = i
for i in range(n):
if i != cand and knows(cand, i) or not knows(i, cand):
return -1
return cand
370.range-addition
Assume you have an array of length n initialized with all 0's and are given k update operations.
Each operation is represented as a triplet: [startIndex, endIndex, inc] which increments each element of subarray A[startIndex ... endIndex] (startIndex and endIndex inclusive) with inc.
Return the modified array after all k operations were executed.
Example:
Given:length = 5,
updates = [
[1, 3, 2],
[2, 4, 3],
[0, 2, -2]
]Output:[-2, 0, 3, 5, 3]
Explanation:
Initial state: [ 0, 0, 0, 0, 0 ]
After applying operation [1, 3, 2]: [ 0, 2, 2, 2, 0 ]
After applying operation [2, 4, 3]: [ 0, 2, 5, 5, 3 ]
After applying operation [0, 2, -2]: [-2, 0, 3, 5, 3 ]
Credits:Special thanks to @vinod23 for adding this problem and creating all test cases.
class Solution(object):
def getModifiedArray(self, length, updates):
"""
:type length: int
:type updates: List[List[int]]
:rtype: List[int]
"""
ans = [0] * length
for update in updates:
start, end, delta = update
ans[start] += delta
if end + 1 < length:
ans[end + 1] -= delta
delta = 0
for i in range(0, length):
delta += ans[i]
ans[i] = delta
return ans
296.best-meeting-point
A group of two or more people wants to meet and minimize the total travel distance. You are given a 2D grid of values 0 or 1, where each 1 marks the home of someone in the group. The distance is calculated using Manhattan Distance, where distance(p1, p2) = |p2.x - p1.x| + |p2.y - p1.y|.
For example, given three people living at (0,0), (0,4), and (2,2):
1 - 0 - 0 - 0 - 1 | | | | | 0 - 0 - 0 - 0 - 0 | | | | | 0 - 0 - 1 - 0 - 0
The point (0,2) is an ideal meeting point, as the total travel distance of 2+2+2=6 is minimal. So return 6.
class Solution(object):
def minTotalDistance(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
iList, jList, ppl = [], [], []
for i in range(0, len(grid)):
for j in range(0, len(grid[0])):
if grid[i][j] == 1:
ppl.append((i, j))
iList.append(i)
jList.append(j)
jList.sort()
m = (iList[len(iList) / 2], jList[len(jList) / 2])
return sum(map(lambda p: abs(p[1] - m[1]) + abs(p[0] - m[0]), ppl))