当前位置:   article > 正文

C++ 双指针_squj

squj

题目1:有序数组的平方

给你一个按非递减顺序 排序的整数数组 nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

  1. vector<int> sortedSquares(vector<int>& nums) {
  2. vector<int> vecRet(nums.size(), 0);
  3. for (int i = 0, j = nums.size() - 1, nop = nums.size() - 1; nop >= 0; ) {
  4. int squi = nums[i] * nums[i];
  5. int squj = nums[j] * nums[j];
  6. if (squi > squj) {
  7. vecRet[nop--] = squi;
  8. i++;
  9. } else {
  10. vecRet[nop--] = squj;
  11. j--;
  12. }
  13. }
  14. return vecRet;
  15. }

题目2:轮转数组

给一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。(空间复杂度为 O(1)

  1. void reverse(vector<int>& nums, int start, int end) {
  2. for (; start < end; start++, end--) {
  3. nums[start] ^= nums[end];
  4. nums[end] ^= nums[start];
  5. nums[start] ^= nums[end];
  6. }
  7. return;
  8. }
  9. void rotate(vector<int>& nums, int k) {
  10. /*
  11. 总体思路:整体反转+两边局部反转(空间复杂度O(1))
  12. 如:nums=[1,2,3,4,5,6,7],k=3 -> [5,6,7,1,2,3,4]
  13. 整体反转后:nums=[7,6,5,4,3,2,1]此时[5,6,7]已经位于前面,[4,3,2,1]已经位于后面
  14. 局部反转[0,2]与[3,6]后为[5,6,7,1,2,3,4]就是答案
  15. */
  16. int len = nums.size();
  17. // k可能大于len,要对k进行取余
  18. k %= len;
  19. // 不反转以及反转后不变的情形
  20. if (k == 0 || len == 1)
  21. return;
  22. // 整体反转
  23. reverse(nums, 0, len - 1);
  24. // 局部反转
  25. reverse(nums, 0, k - 1);
  26. reverse(nums, k, len - 1);
  27. }

题目3:移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

(必须在不复制数组的情况下原地对数组进行操作。)

  1. void moveZeroes(vector<int>& nums) {
  2. int i = 0, j = 0;
  3. int len = nums.size();
  4. for (; i < len; i++) {
  5. if(0 != nums[i]) {
  6. nums[j++] = nums[i];
  7. }
  8. }
  9. while(j < len) nums[j++] = 0;
  10. }

题目4:两数之和-输入有序数组

给一个下标从 1 开始的整数数组 numbers ,该数组已按非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

可以假设每个输入只对应唯一的答案 ,而且不可以重复使用相同的元素。

  1. vector<int> twoSum(vector<int>& numbers, int target) {
  2. for (int i = 0, j = numbers.size() - 1; i < j;) {
  3. int sum = numbers[i] + numbers[j];
  4. if(sum == target) return vector<int>{i + 1, j + 1};
  5. else if (sum > target) j--;
  6. else i++;
  7. }
  8. return vector<int>(0);
  9. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/628820
推荐阅读
相关标签
  

闽ICP备14008679号