> 文章列表 > 数据结构基础day1

数据结构基础day1

数据结构基础day1

题目:136. 只出现一次的数字

要求时间线形复杂度,空间常数复杂度

解法:位运算异或

关于异或的性质:1. 与0异或等于本身;2. 与自己异或等于0;3. 异或运算有交换律和结合律

class Solution {
public:int singleNumber(vector<int>& nums) {int t=0;for(int num:nums) t = t^num;	//(a⊕a)⊕(a⊕a)⊕⋯⊕(a⊕a)⊕treturn t;}
};

题目:169. 多数元素

我的解法:(wrong)

没有初始化vector,且复杂度很高,注意使用vector和map的区别,map不用初始化大小。

class Solution {
public:int majorityElement(vector<int>& nums) {int n = nums.size(),ans;vector<int> counts;for(int num:nums){counts[num]++;}for(int i=0; i<counts.size(); ++i){if(counts[i]>n/2){ans = i;break;}}return ans;}
};

其他解法1:哈希表

class Solution {
public:int majorityElement(vector<int>& nums) {int ans, cnt=0;unordered_map<int, int> hash;	//使用hash表存储每个数字出现的次数,取出次数最多的数字for(int num:nums){++hash[num];if(hash[num]>cnt){	//在循环中直接记录最大值ans = num;cnt = hash[num];}}return ans;}
};

其他解法2:排序

排序后,众数会出现在n/2的位置

class Solution {
public:int majorityElement(vector<int>& nums) {sort(nums.begin(), nums.end());	//注意sort的写法,头和尾return nums[nums.size()/2];}
};

其他解法3:“占山头”

设置一个候选众数candidate和它出现的次数cnt(初始为0)
如果我们把众数记为+1,把其他数记为−1,将它们全部加起来,显然和大于 0,从结果本身我们可以看出众数比其他数多。

class Solution {
public:int majorityElement(vector<int>& nums) {int candidate, cnt=0;for(int num:nums){if(cnt==0){	//如果目前没有候选者,当前元素成为候选者candidate=num;}if(candidate==num){	//是候选者,数量++++cnt;}else{	//不是候选者,数量--,直到等于0,设立新的候选者,众数数量最多,最后一定会是候选者--cnt;}}return candidate;}
};

题目:15. 三数之和

解法:排序➕双指针

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int n = nums.size();if(n<3) return {};	//特判,元素个数小于3,返回空数组sort(nums.begin(), nums.end());	//排序vector<vector<int>> ans;	//存储答案for(int i=0; i<n; ++i){	//从头遍历if(nums[i]>0) return ans;	//如果目前元素为最小元素都大于0,则不可能存在这之后有三个元素加和等于0if(i>0 && nums[i]==nums[i-1]) continue;	//元素不能重复int k = -nums[i];	//求两数之和等于-nums[i]int t = n-1;		//尾指针int h = i+1;	//头指针while(h<t){	//外条件:头小于尾if(nums[h]+nums[t]>k){	//如果两数之和大于k,则尾指针前移--t;}else if(nums[h]+nums[t]==k){	//若等于k,则存储这三个数,同时移动头尾指针ans.push_back({nums[i], nums[h], nums[t]});--t; ++h;while(h<t && nums[h]==nums[h-1]) ++h;	//头指针不重复while(h<t && nums[t]==nums[t+1]) --t;	//尾指针不重复}else{	//若小于k,头指针后移++h;}}}return ans;	//返回答案}
};