[关闭]
@rg070836rg 2018-02-28T20:38:27.000000Z 字数 2947 阅读 889

信息

未分类


判断浮点数a,b是否相等
if(a==b)
if(fabs(a=b)<1e-9)

判断是否是奇数
x%2!=0 更好
x%2==1(不能判断负数)

vector

int n;
cin>>n;
int a[n];

vector num;

027 移除元素

双指针,一次扫描
设置两个指针 分别
fornt tail
思路:front和tail分别从前后向中间扫描,当两个指针相遇,就结束。
如果两个指针没有相遇
if(front 移动frnot,如果遇到了A[front]==val,暂停
移动tail,如果我们遇到了一个不是val,把值复制给A[front]

  1. class Solution {
  2. public:
  3. int removeElement(vector<int>& nums, int val) {
  4. int front=0;
  5. int tail=nums.size()-1;
  6. while(front<=tail)
  7. {
  8. if(nums[front]==val && nums[tail]!=val)
  9. {
  10. nums[front]=nums[tail];
  11. nums[tail]=val;
  12. }
  13. if(nums[front]!=val)
  14. front++;
  15. if(nums[tail]==val)
  16. tail--;
  17. }
  18. return tail+1;
  19. }
  20. };

双指针,顾名思义,就是利用两个指针去遍历数组,
一般来说,遍历数组是采用一个指针,而两个指针就是一般在有序数组中使用,一个放在头部,一个放在尾部,同时向中间走,直到两个指针相交。
front=0;
tail=A.size()-1;

一般的循环结束条件、
while(front {
......
}

in place 不额外开数组(不用额外的空间)

1 两数之和

思路1:双重循环 o(n^2)

  1. class Solution {
  2. public:
  3. vector<int> twoSum(vector<int>& nums, int target) {
  4. vector<int> result;//动态数组
  5. for(int i=0;i<nums.size();i++)
  6. {
  7. for(int j=i+1;j<nums.size();j++)
  8. {
  9. if(nums[i]+nums[j]==target)
  10. {
  11. result.push_back(i);
  12. result.push_back(j);
  13. return result;
  14. }
  15. }
  16. }
  17. }
  18. };

思路2:
双指针

  1. class Solution {
  2. public:
  3. vector<int> twoSum(vector<int>& nums, int target) {
  4. vector<int> result;//动态数组
  5. vector<int> n=nums;//backup
  6. sort(nums.begin(),nums.end());//已经完成排序
  7. int front=0;
  8. int tail=nums.size()-1;
  9. while(front<tail)
  10. {
  11. if(nums[front]+nums[tail]==target)
  12. {
  13. for(int i=0;i<n.size();i++)
  14. {
  15. if(nums[front]==n[i])
  16. {
  17. result.push_back(i);
  18. break;
  19. }
  20. }
  21. for(int i=n.size()-1;i>=0;i--)
  22. {
  23. if(nums[tail]==n[i])
  24. {
  25. result.push_back(i);
  26. break;
  27. }
  28. }
  29. return result;
  30. }
  31. if(nums[front]+nums[tail]>target)
  32. tail--;
  33. else
  34. front++;
  35. }
  36. return nums;
  37. }
  38. };

思路3:利用hashmap优化

  1. class Solution {
  2. public:
  3. vector<int> twoSum(vector<int>& nums, int target) {
  4. //用hashmap O(1) c++ unorder_map 实现键值对应
  5. vector<int> res;
  6. unordered_map<int,int> map;
  7. int tmp;
  8. for(int i=0;i<nums.size();i++)
  9. {
  10. tmp=target-nums[i];
  11. unordered_map<int,int>::iterator it =map.find(tmp);
  12. if(it != map.end())
  13. {
  14. return vector<int>({it->second,i});
  15. }
  16. map[nums[i]]=i;
  17. }
  18. }
  19. };

15 三数之和

思路1 三重循环,容器判重
思路2
随机确定了一个数 a --》在剩下的数,找2个数,和0-a

1.数组中允许重复的数
2.结果按照升序排序
3.不能出现重复 在操作前,首先进行排序

l m r

如何确定第一个数left?肯定是第一层循环,

  1. for(int l=0;l<nums.size()&&nums[l]<=0;l++)
  2. 接下来,确定midright
  3. m=l+1;
  4. r=nums.size()-1;
  5. while(m<r)
  6. {
  7. //....
  8. int tmp=0-nums[l];
  9. if(nums[m]+mums[r]==tmp)
  10. {
  11. //加入结果集
  12. }
  13. else if(nums[m]+nums[r]>tmp)
  14. r--;
  15. else
  16. m++;
  17. }

//不能判重
如果l指向的是前面判断过的,跳过,
如果m和r在往中间移动的时候,是刚才的数,跳过

  1. m=l+1;
  2. r=nums.size()-1;
  3. while(m<r)
  4. {
  5. //....
  6. int tmp=0-nums[l];
  7. if(left>0 && nums[left]==nums[left-1])
  8. continue;
  9. if(nums[m]+mums[r]==tmp)
  10. {
  11. //加入结果集
  12. //判断m,r
  13. while(m<r && nums[m+1]==nums[m]) m++;
  14. while(m<r && nums[r-1]==nums[r]) r--;
  15. }
  16. else if(nums[m]+nums[r]>tmp)
  17. r--;
  18. else
  19. m++;
  20. }

AC代码

  1. class Solution {
  2. public:
  3. vector<vector<int>> threeSum(vector<int>& nums) {
  4. sort(nums.begin(),nums.end());
  5. vector<vector<int>> list;
  6. int m,r;
  7. for(int l=0;l<nums.size()&&nums[l]<=0;l++)
  8. {
  9. m=l+1;
  10. r=nums.size()-1;
  11. int tmp=0-nums[l];
  12. if(l>0 && nums[l]==nums[l-1])
  13. continue;
  14. while(m<r)
  15. {
  16. if(nums[m]+nums[r]==tmp)
  17. {
  18. //加入结果集
  19. int t_m = nums[m],t_r=nums[r];
  20. vector<int> tmp;
  21. tmp.push_back(nums[l]);
  22. tmp.push_back(nums[m]);
  23. tmp.push_back(nums[r]);
  24. //cout<<nums[l]<<" "<<nums[m]<<" "<<nums[r]<<" "<<endl;
  25. list.push_back(tmp);
  26. //判断m,r
  27. while(m<r && nums[++m]==t_m);
  28. while(m<r && nums[--r]==t_r);
  29. }
  30. else if(nums[m]+nums[r]>tmp)
  31. r--;
  32. else
  33. m++;
  34. }
  35. }
  36. return list;
  37. }
  38. };
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注