优化用于从预定义范围内确定合格分数的算法
Optimize algorithm for determining qualifying score from a predefined range
问题:
给你一个分数列表(一维数组)(一些数字)。
您还有两个列表:
lowerLimits :包含下限值的列表
upperLimits :包含上限值的列表
你的任务是找出有多少分数落在每个 (lowerLimit[i], upperLimit[i]) 对的包含范围内。
示例 1:
Inputs:
scores = [1,3,5,6,8]
lowerLimits = [2]
upperLimits = [6]
Output:[3]
说明:
scores 数组中的三个元素(3,5 和 6),落在 [2,6]
包含的范围内
示例 2:
Inputs:
scores = [4,8,7]
lowerLimits = [2,4]
upperLimits = [8,4]
Output: [3,1]
说明:
分数数组中的所有三个元素(4,8 和 7)都落在第一个包含范围 [2,8] 内,只有一个元素(4)落在 [4,4] 的包含范围内。所以要返回的答案是计数数组 [3,1].
到目前为止我尝试了什么算法?
1. Iterate through each lowerLimit - upperLimit pair
2. For this pair check all scores values
3. Repeat step 1 to 2 for all lowerLimit - upperLimit pairs
Python 3 实施
# utility function
def jobOffers(scores, lowerLimits, upperLimits):
answer = []
for index, item in enumerate(lowerLimits):
dummy = []
for score in scores:
if score >= lowerLimits[index] and score <= upperLimits[index]:
dummy.append(score)
if dummy:
answer.append(len(dummy))
return answer
# dummy inputs
scores = [4,8,7]
lowerLimits = [2,4]
upperLimits = [8,4]
print(jobOffers(scores,lowerLimits,upperLimits))
问题:
使用这种蛮力算法,我只能通过 15 个测试用例中的 3 个。事实上,代码在大约 7 个测试用例中超时,而 returns 个剩余失败测试用例的错误结果。不幸的是,服务器不提供失败的测试用例列表,所以我无法适应这种情况的逻辑。目前,我想不出任何替代策略来解决这个问题。可以
def jobOffers(scores, lowerLimits, upperLimits):
return [
len([
i if i >= lowerLimits[i] and i<= upperLimits[i]
for i in range(len(lowerLimits))
])
]
简而言之,dummy 不是布尔值,当为空时可能会计算为 false。我假设您的脚本仅适用于空数组和限制为 1 的数组?
def jobOffers(scores, lowerLimits, upperLimits):
pairs = list(zip(lowerLimits, upperLimits))
result = []
for x in range(len(pairs)):
u = pairs[x][0]
l = pairs[x][1]
a = [x for x in scores if x in range(u, l + 1)]
result.append(len(a))
return result
还有哪些测试用例?希望这有帮助。
如果有人感兴趣,我找到了解决方案。我们应该对正确的索引进行二分查找,这样可以节省时间复杂度。解决方法如下:
问题:
给你一个分数列表(一维数组)(一些数字)。
您还有两个列表:
lowerLimits :包含下限值的列表
upperLimits :包含上限值的列表
你的任务是找出有多少分数落在每个 (lowerLimit[i], upperLimit[i]) 对的包含范围内。
示例 1:
Inputs:
scores = [1,3,5,6,8]
lowerLimits = [2]
upperLimits = [6]
Output:[3]
说明: scores 数组中的三个元素(3,5 和 6),落在 [2,6]
包含的范围内示例 2:
Inputs:
scores = [4,8,7]
lowerLimits = [2,4]
upperLimits = [8,4]
Output: [3,1]
说明: 分数数组中的所有三个元素(4,8 和 7)都落在第一个包含范围 [2,8] 内,只有一个元素(4)落在 [4,4] 的包含范围内。所以要返回的答案是计数数组 [3,1].
到目前为止我尝试了什么算法?
1. Iterate through each lowerLimit - upperLimit pair
2. For this pair check all scores values
3. Repeat step 1 to 2 for all lowerLimit - upperLimit pairs
Python 3 实施
# utility function
def jobOffers(scores, lowerLimits, upperLimits):
answer = []
for index, item in enumerate(lowerLimits):
dummy = []
for score in scores:
if score >= lowerLimits[index] and score <= upperLimits[index]:
dummy.append(score)
if dummy:
answer.append(len(dummy))
return answer
# dummy inputs
scores = [4,8,7]
lowerLimits = [2,4]
upperLimits = [8,4]
print(jobOffers(scores,lowerLimits,upperLimits))
问题:
使用这种蛮力算法,我只能通过 15 个测试用例中的 3 个。事实上,代码在大约 7 个测试用例中超时,而 returns 个剩余失败测试用例的错误结果。不幸的是,服务器不提供失败的测试用例列表,所以我无法适应这种情况的逻辑。目前,我想不出任何替代策略来解决这个问题。可以
def jobOffers(scores, lowerLimits, upperLimits):
return [
len([
i if i >= lowerLimits[i] and i<= upperLimits[i]
for i in range(len(lowerLimits))
])
]
简而言之,dummy 不是布尔值,当为空时可能会计算为 false。我假设您的脚本仅适用于空数组和限制为 1 的数组?
def jobOffers(scores, lowerLimits, upperLimits):
pairs = list(zip(lowerLimits, upperLimits))
result = []
for x in range(len(pairs)):
u = pairs[x][0]
l = pairs[x][1]
a = [x for x in scores if x in range(u, l + 1)]
result.append(len(a))
return result
还有哪些测试用例?希望这有帮助。
如果有人感兴趣,我找到了解决方案。我们应该对正确的索引进行二分查找,这样可以节省时间复杂度。解决方法如下: