1.模拟
python
class Solution:
def countOdds(self, low: int, high: int) -> int:
# 模拟
return len(range(low,high+1,2)) if low & 1 else len(range(low+1,high+1,2))
2.数学
总结规律。首为偶数就向下取整;奇数就向上取整。注意整数向上向下取整值相同。
python
class Solution:
def countOdds(self, low: int, high: int) -> int:
# 数学
return (high - low + 1) // 2 if low % 2 == 0 else ceil((high - low + 1) / 2)
3.前缀和。来自官方题解(. - 力扣(LeetCode))。
python
class Solution:
def countOdds(self, low: int, high: int) -> int:
# 前缀和
# 前low-1包含的奇数 - 前high包含的奇数,从0开始
def pre_odd(num):
return (num + 1) // 2
return pre_odd(high) - pre_odd(low - 1)
遍历
python
class Solution:
def arraySign(self, nums: List[int]) -> int:
# 遍历
# 有0为0,无0统计负数的个数
cnt = 0
for x in nums:
if x == 0:
return 0
if x < 0:
cnt += 1
return -1 if cnt & 1 else 1
1.遍历+哈希表。
python
class Solution:
def isPossibleToSplit(self, nums: List[int]) -> bool:
# 每一个元素最多只能出现2次
# 遍历+哈希表
# 时复O(n),空复O(101)
hash_list = [0] * 101
for x in nums:
if hash_list[x] == 2:
return False
hash_list[x] += 1
return True
2.排序+遍历
python
class Solution:
def isPossibleToSplit(self, nums: List[int]) -> bool:
# 每一个元素最多只能出现2次
# 排序+遍历
# 时复O(nlogn),空复O(1)
nums.sort()
flag = 0
pre = nums[0]
for i in range(1,len(nums)):
if flag and nums[i] == pre:
return False
if nums[i] == pre:
flag = 1 #出现两次标记为1
else:
flag = 0
pre = nums[i]
return True
3.Counter函数1。老忘记有这函数,来自灵神题解(. - 力扣(LeetCode))。
python
class Solution:
def isPossibleToSplit(self, nums: List[int]) -> bool:
# 每一个元素最多只能出现2次
# Counter函数1
return max(Counter(nums).values()) <= 2
- Counter函数2。来自灵神题解。
python
class Solution:
def isPossibleToSplit(self, nums: List[int]) -> bool:
# 每一个元素最多只能出现2次
# Counter函数2
return all(x <= 2 for x in Counter(nums).values())
遍历
python
class Solution:
def minStartValue(self, nums: List[int]) -> int:
# 遍历
# 求出最小前n项和
s = 0
mins = inf
for x in nums:
s += x
mins = min(mins, s) #更新前n和最小值
return 1 - mins if mins < 1 else 1
完
感谢你看到这里!一起加油吧!