1、主要元素
数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。
示例 1:
输入:[1,2,5,9,5,9,5,5,5]
输出:5
class Solution:
def majorityElement(self, nums: List[int]) -> int:
n=len(nums)
nums==sorted(nums)
flag=-1
i=0
while(i<n):
m=nums.count(nums[i])
if(m>n/2):
flag=nums[i]
break
i=i+m
return flag
参考答案:
#哈希表
class Solution:
def majorityElement(self, nums: List[int]) -> int:
n = len(nums)
hashmap = defaultdict(int)#接收一个工厂函数作为参数
for x in nums:
hashmap[x] += 1
if hashmap[x] > n // 2:
return x
return -1
2、存在重复元素 II
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [1,2,3,1], k = 3
输出:true
参考答案:
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
pos = {}
for i, num in enumerate(nums):
if num in pos and i - pos[num] <= k:
return True
pos[num] = i
return False
3、种花问题
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 表示没种植花,1 表示种植了花。另有一个数 n ,能否在不打破种植规则的情况下种入 n 朵花?能则返回 true ,不能则返回 false
示例 1:
输入:flowerbed = [1,0,0,0,1], n = 1
输出:true
贪心算法:
class Solution:
def canPlaceFlowers(self, flowerbed: List[int], n: int) -> bool:
count, m, prev = 0, len(flowerbed), -1
for i in range(m):
if flowerbed[i] == 1:
if prev < 0:
count += i // 2
else:
count += (i - prev - 2) // 2
prev = i
if prev < 0:
count += (m + 1) // 2
else:
count += (m - prev - 1) // 2
return count >= n
4、检查整数及其两倍数是否存在
给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。
更正式地,检查是否存在两个下标 i 和 j 满足:
i != j
0 <= i, j < arr.length
arr[i] == 2 * arr[j]
示例 1:
输入:arr = [10,2,5,3]
输出:true
解释:N = 10 是 M = 5 的两倍,即 10 = 2 * 5 。
解答:
class Solution:
def checkIfExist(self, arr: List[int]) -> bool:
temp=0
zero=arr.count(0)
if zero>=2:
return True
for i in range(len(arr)):
temp=arr.count(arr[i]*2)
if temp>0 and arr[i]!=0:
return True
if(temp==0):
return False
5、二进制加法
给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "10"
输出: "101"
参考答案:
class Solution:
def addBinary(self, a, b) -> str:
return '{0:b}'.format(int(a, 2) + int(b, 2))#int(a,2)转换为2进制
位算法:
class Solution:
def addBinary(self, a, b) -> str:
x, y = int(a, 2), int(b, 2)
while y:
answer = x ^ y#^按位异或(长度不一样右端对齐)
carry = (x & y) << 1#按位与&;<<左移运算符
x, y = answer, carry#x保存结果,y保存进位
return bin(x)[2:]#返回二进制([2:]去掉0b)
模拟:
class Solution {
public:
string addBinary(string a, string b) {
string ans;
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
int n = max(a.size(), b.size()), carry = 0;
for (size_t i = 0; i < n; ++i) {
carry += i < a.size() ? (a.at(i) == '1') : 0;
carry += i < b.size() ? (b.at(i) == '1') : 0;
ans.push_back((carry % 2) ? '1' : '0');
carry /= 2;
}
if (carry) {
ans.push_back('1');
}
reverse(ans.begin(), ans.end());
return ans;
}
};