当前位置:   article > 正文

力扣初级算法书 ——数组刷题总结_力扣题基础教材

力扣题基础教材

**数组的题目总结:

(刷数组刷着刷着刷到了动态规划的题在里面差评)
1.熟练掌握双指针的这种思想,代码尽量逻辑清楚
2.对于寻找某个元素:排序、哈希、二分 、利用位运算的性质等

基本就上面的这些 有个题蛮特殊 旋转数组(给大家贴个地址,这个题蛮不错的)**
189. 旋转数组

136. 只出现一次的数字

在这里插入图片描述
思路:1.排序判断就行
2.进阶:位运算异或的性质 :俩个相同的数异或为0 ,所以最后异或的值就是出现一次的元素的值
代码:

//位运算的性质
class Solution {
public:
    int singleNumber(vector<int>& nums) {
   int s=0;
   for(auto i :nums)
   {
    s^=i;
   }
   return s;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

两个数组的交集 II

在这里插入图片描述
思路:双指针的移动就行了,当移动到一个末尾就结束了,因为生成的数组一定是之前俩个数组的子集
当无法存储到内存上时我们应该使用哈希的方法更便捷(最特别的情况我想你哈希都能存你数组不能存?可能是我没理解题解的意思)
代码:

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;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

66. 加一

在这里插入图片描述
思路:简单的模拟题(我的代码好像复杂了一点点)
只是有一点点注意的地方见代码

代码:

//可能最高位进位
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;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

283. 移动零

在这里插入图片描述
思路:经典的双指针,直接见代码

代码:

//双指针的做法,注意特判,双指针用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++;
     }
     
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/117705
推荐阅读
相关标签
  

闽ICP备14008679号