class Solution:
def inventoryManagement(self, stock: List[int]) -> int:
votes, count= 0,0
for num in stock:
if votes 0: x= num
if num x: votes += 1
else: votes-=1
for num in stock:
if num x:count +=1
return x if count>len(stock)//2 else 0
时间o n 空间 o 1
class Solution {
public:
int inventoryManagement(vector& stock) {
int flag = 1;
if(stock.size() 1) return stock[0];
int x = stock[0];
for(int i = 1; i < stock.size(); i ++) {
if(x stock[i]) flag ++;
else flag –;
if(flag 0) {
if(i < stock.size() – 1) {
x = stock[i + 1];
}
continue;
}
}
return x;
}
};时间复杂度O(n),空间复杂度O(1)
java
class Solution{
public int majorityElement(int[] nums){
int x = 0,votes = 0;
for(int num : nums){
if(votes 0) x = num;
votes += num x ? 1 : -1;
}
return x;
}
}
提交
看到这个题最开始想的就是直接使用哈希表来做:
class Solution {
public int inventoryManagement(int[] stock) {
if(stock.length==1){
return stock[0];
}
Map<Integer,Integer> map = new HashMap<>();
int result = 0;
for(int i=0;i<stock.length;i++){
if(map.containsKey(stock[i])){
int temp = map.get(stock[i]);
if(temp+1>stock.length/2){
result = stock[i];
break;
}
map.put(stock[i],temp+1);
}else{
map.put(stock[i],1);
}
}
return result;
}
}
之后觉得可以先进行排序,因为题中说了最多的数字是超过一半的,所以排序之后mid就是结果:
public int inventoryManagement(int[] stock) {//由于最多的数字超过一半,所以
Arrays.sort(stock);
int mid = stock.length/2;
return stock[stock.length/2];
}
然后是帅地最优解,摩尔投票法:
class Solution {
public int inventoryManagement(int[] stock) {
if(stock.length<=2){
return stock[0];
}
int result = stock[0];
int sum = 1;
for(int i=1;i<stock.length;i++){
if(sum==0){
result = stock[i];
sum = 1;
}else{
if(result==stock[i]){
sum++;
}else{
sum--;
}
}
}
return result;
}
}
共以下 16 个回答
class Solution {& stock) {
public:
//数量超出stock.length/2, 那么排序后,中间元素是所求id。
int inventoryManagement(vector
sort(stock.begin(),stock.end());
};
每个数开始时的票数votes=1,如果下一个数等于当前数,则votes++, 否则votes–.最后留下的一定是众数。
时间复杂度:O(n)
额外空间复杂度:O(1)
class Solution {& stock) {
public:
int inventoryManagement(vector
int x = stock[0];
int votes = 0;
for(int num : stock){
if(votes 0) x = num;
if(num x )
{
votes += 1;
}
else
{
votes -= 1;
}
}
return x;
}
};
时间复杂度O(n), 空间复杂度O(1)
时间复杂度O(n),空间复杂度O(1)
时间复杂度:O(n)
额外空间复杂度:O(1)
时间复杂度O(n)
空间复杂度O(1)
摩尔投票法
“`C++& stock) {
class Solution {
public:
int inventoryManagement(vector
if(stock.size() < 3) { return stock[0]; } //摩尔投票,边界条件 int sum = 0; int x; for(int i = 0; i < stock.size(); i++) { if(sum == 0) { x = stock[i]; sum++; } else { if(x == stock[i]) { sum++; } else { sum--; } } } return x; } }; ```
class Solution {
public int inventoryManagement(int[] stock) {
int curNum = stock[0];
int count = 1;
for(int i = 1; i < stock.length; i++){
if(stock[i] != curNum)
count–;
else
count++;
if(count < 0){
count = -count;
curNum = stock[i];
}
}
return curNum;
}
//时间复杂On
//空间O1
打卡
时间复杂度$O(n)$,空间复杂度$O(1)$
class Solution:
def inventoryManagement(self, stock: List[int]) -> int:
votes, count= 0,0
for num in stock:
if votes 0: x= num
if num x: votes += 1
else: votes-=1
for num in stock:
if num x:count +=1
return x if count>len(stock)//2 else 0
时间o n 空间 o 1
class Solution {& stock) {
public:
int inventoryManagement(vector
int flag = 1;
if(stock.size() 1) return stock[0];
int x = stock[0];
for(int i = 1; i < stock.size(); i ++) {
if(x stock[i]) flag ++;
else flag –;
if(flag 0) {
if(i < stock.size() – 1) {
x = stock[i + 1];
}
continue;
}
}
return x;
}
};时间复杂度O(n),空间复杂度O(1)
java
class Solution{
public int majorityElement(int[] nums){
int x = 0,votes = 0;
for(int num : nums){
if(votes 0) x = num;
votes += num x ? 1 : -1;
}
return x;
}
}
提交
思路:投票法:每个数开始时的票数votes=1,如果下一个数等于当前数,则votes++, 否则votes–.
时间复杂度:O(n)
空间复杂度:O(1)