赞
踩
(刷数组刷着刷着刷到了动态规划的题在里面差评)
1.熟练掌握双指针的这种思想,代码尽量逻辑清楚
2.对于寻找某个元素:排序、哈希、二分 、利用位运算的性质等
基本就上面的这些 有个题蛮特殊 旋转数组(给大家贴个地址,这个题蛮不错的)**
189. 旋转数组
思路:1.排序判断就行
2.进阶:位运算异或的性质 :俩个相同的数异或为0 ,所以最后异或的值就是出现一次的元素的值
代码:
//位运算的性质
class Solution {
public:
int singleNumber(vector<int>& nums) {
int s=0;
for(auto i :nums)
{
s^=i;
}
return s;
}
};
思路:双指针的移动就行了,当移动到一个末尾就结束了,因为生成的数组一定是之前俩个数组的子集
当无法存储到内存上时我们应该使用哈希的方法更便捷(最特别的情况我想你哈希都能存你数组不能存?可能是我没理解题解的意思)
代码:
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { vector<int> G; sort(nums1.begin(),nums1.end()); sort(nums2.begin(),nums2.end()); int left1=0,left2=0; while(left1 < nums1.size() && left2 <nums2.size()) { if(nums1[left1]==nums2[left2]) { G.push_back(nums1[left1]); left1++,left2++; } else if(nums1[left1]<nums2[left2]) { left1++; } else left2++; } return G; } };
思路:简单的模拟题(我的代码好像复杂了一点点)
只是有一点点注意的地方见代码
代码:
//可能最高位进位 class Solution { public: vector<int> plusOne(vector<int>& digits) { digits[digits.size()-1]++; vector<int> G; for(int i=digits.size()-1;i>0;i--) { if(digits[i]>=10) digits[i]-=10,digits[i-1]++; G.insert(G.begin(),digits[i]); } //最高位是否进位 if(digits[0]==10) { G.insert(G.begin(),0); G.insert(G.begin(),1); } else G.insert(G.begin(),digits[0]); return G; } };
思路:经典的双指针,直接见代码
代码:
//双指针的做法,注意特判,双指针用if条件来一次一次移动不用特判 class Solution { public: void moveZeroes(vector<int>& nums) { int left=0,right=0; while(right<nums.size()) { if(nums[right]) { //用swap就不用最后再赋值0 swap(nums[left],nums[right]); left++; } right++; } } };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。