美文网首页
LeetCodeDay02

LeetCodeDay02

作者: GoMomi | 来源:发表于2018-04-11 09:15 被阅读0次

    189. 旋转数组

    描述
    • 将包含 n 个元素的数组向右旋转 k 步。
    • 例如,如果 n = 7 , k = 3,给定数组 [1,2,3,4,5,6,7] ,向右旋转后的结果为 [5,6,7,1,2,3,4]。
    注意:
    • 尽可能找到更多的解决方案,这里最少有三种不同的方法解决这个问题。
    [显示提示]
    • 要求空间复杂度为 O(1)
    • 关联的问题: 反转字符串中的单词 II
    思路:
    1. 最蠢的方法,就是没旋转一次就移动一次所有元素,总共的时间复杂度O(K*N)。以后这种一想到的蠢方法还是要落于实践,有时候想到和写出来是不一样的。这次在写的过程中就犯傻了,一定要从左往右一个一个复制,不知都从后往前可以省事很多。
    2. 最优解是基于旋转的,先全部旋转,在旋转左边,旋转右边即可。不要被右移这个操作给蒙蔽了,其实仔细观察源字符串和结果,其本质是个旋转的过程。
    // 蠢方法01
    class Solution_189_01 {
     public:
      void rotate(vector<int>& nums, int k) {
        if (nums.empty() || k < 1) return;
        int len = nums.size();
        k = k % len;
        for (int i = 0; i < k; i++) {
          int pre = nums[0];
          for (int j = 0; j < len; j++) {
            int next = nums[j + 1];
            nums[j + 1] = pre;
            pre = next;
          }
          nums[0] = pre;
        }
      }
    };
    
    // 蠢方法02
    class Solution_189_02 {
     public:
      void rotate(vector<int>& nums, int k) {
        if (nums.empty() || k < 1) return;
        int len = nums.size();
        k = k % len;
        while (k) {
          int tail = nums[len - 1];
          for (int i = len - 1; i > 0; i--) {
            nums[i] = nums[i - 1];
          }
          nums[0] = tail;
          k--;
        }
      }
    };
    
    // 基于旋转
    class Solution_189_03 {
     public:
      void rotate(vector<int>& nums, int k) {
        int len = nums.size();
        if (len < 1 || k < 1) {
          return;
        }
        k = k % len;
        reverse(nums, nums.begin(), nums.end() - 1);
        reverse(nums, nums.begin(), nums.begin() + k - 1);
        reverse(nums, nums.begin() + k, nums.end() - 1);
      }
      void reverse(vector<int>& nums, vector<int>::iterator start,
                   vector<int>::iterator end) {
        while (start < end) {
          int tmp = *start;
          *start = *end;
          *end = tmp;
          start++;
          end--;
        }
      }
    };
    

    217. 存在重复

    定一个整数数组,判断是否存在重复元素。
    如果任何值在数组中出现至少两次,函数应该返回 true。如果每个元素都不相同,则返回false。

    思路:
    1、暴力解法,时间复杂度O(n^2)
    2、容器,利用一个set保存出现过的数字。时间复杂度O(1),空间复杂度O(n)
    3、排序,会改变元素组,具体复杂度依赖排序算法。

    描述
    • 定一个整数数组,判断是否存在重复元素。
    • 如果任何值在数组中出现至少两次,函数应该返回 true。如果每个元素都不相同,则返回false。
    思路:
    1. 暴力解法,时间复杂度O(n^2)
    2. 容器,利用一个set保存出现过的数字。时间复杂度O(1),空间复杂度O(n)
    3. 排序,会改变元素组,具体复杂度依赖排序算法。
    class Solution_217_01 {
     public:
      bool containsDuplicate(vector<int>& nums) {
        if (nums.size() <= 1) return false;
        for (auto iter = nums.begin(); iter != nums.end(); iter++) {
          for (auto val = nums.begin(); val != nums.end(); val++) {
            if (*iter == *val && iter != val) return true;
          }
        }
        return false;
      }
    };
    
    class Solution_217_02 {
     public:
      bool containsDuplicate(vector<int>& nums) {
        if (nums.size() <= 1) return false;
        set<int> numSet;
        for (auto iter = nums.begin(); iter != nums.end(); iter++) {
          if (numSet.find(*iter) == numSet.end()) {
            numSet.insert(*iter);
          } else {
            return true;
          }
        }
        return false;
      }
    };
    
    class Solution_217_03 {
     public:
      bool containsDuplicate(vector<int>& nums) {
        if (nums.size() <= 1) return false;
        sort(nums.begin(), nums.end());
        for (auto iter = nums.begin(); iter != nums.end() - 1; iter++) {
          if (*iter == *(iter + 1)) {
            return true;
          }
        }
        return false;
      }
    };
    ``

    相关文章

      网友评论

          本文标题:LeetCodeDay02

          本文链接:https://www.haomeiwen.com/subject/znxahftx.html