leetcode_刷题笔记
217 存在重复元素
1.使用双指针来做
可以实现但是不用说也可以直接看到,效率太低了
class Solution { public: bool containsDuplicate(vector<int>& nums) { int length = nums.size(); for(int i=0;i<length-1;i++) { for(int j=i+1;j<length;j++) { if(nums[i]==nums[j]) { return true; } } } return false; }
第二想到的,就是直接进行两两比对,但是必须考虑一个问题,这仅仅考虑了间隔一的大小,没有考虑间隔多的比较,所以我们只需要将全部的可能压缩在间隔1就可以用for遍历
想法到位,直接写就好了,这里注意下数组的越界问题。
class Solution { public: bool containsDuplicate(vector<int>& nums) { int length = nums.size(); sort(nums.begin(),nums.end()); for(int i=0;i<nums.size()-1;i++) { if(nums[i]==nums[i+1]) { return true; } } return false; } };
leetcode 53 最大子序和
动态规划问题:设计状态思路:把不确定的因素确定下来,进而把子问题定义清楚,把子问题定义得简单。动态规划的思想通过解决了一个一个简单的问题,进而把简单的问题的解组成了复杂的问题的解。
因为我们把子问题定义的更清楚,子问题之间的联系就容易观察到。这是我们定义子问题、定义状态的经验。
所以重点在于如何去合理的定义我们的子问题。只有把子问题定义清楚,才可以找到内部联系,才可以去构建我们的动态规划方程
dp[i]:表示以 nums[i] 结尾 的 连续 子数组的最大和。
class Solution: def maxSubArray(self, nums: List[int]) -> int: #init状态 size = len(nums) dp = [0 for i in range(size)] dp[0] = nums[0] #状态转移方程 for i in range(1,size): if(dp[i-1]>=0): dp[i] = dp[i-1] + nums[i] else: dp[i] = nums[i] #给出题解 return max(dp)
leetcode 136 只出现一次的数字
还是使用数组指针思想,先把数组进行排序,让相同的元素在自己的旁边,然后让指针每一次轮回跳跃2进行相等检测就可以了。
sort(nums.begin(), nums.end()); for (int i = 0; i < nums.size();) { if (i == nums.size()-1) { cout << nums[i]; break; } if (nums[i] == nums[i + 1]) { i = i + 2; continue; } else { cout << nums[i]; break; }
方法:使用位运算
数组中的全部元素的异或运算结果即为数组中只出现一次的数字
原理:任何数和0做异或运算,结果仍然是原来的数
任何数和其自身做异或运算,结果是 0。
这个是真的牛!
class Solution { public: int singleNumber(vector<int>& nums) { int res = nums[0]; for(int i=1;i<nums.size();i++) { res = res^nums[i]; } return res; } };
多数元素 leetcode 169
这里明显应该采用键值对的方式去存储数字与数字出现的次数
所以在c++中我们通过哈希表去实现这个操作。
class Solution { public: int majorityElement(vector<int>& nums) { unordered_map<int,int> count; int res=0; for(int num:nums) { count[num]++; if(count[num]>nums.size()/2) { res = num; } } return res; } };

浙公网安备 33010602011771号