文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

数据结构与算法之按奇偶排序数组II

2024-12-02 19:33

关注

一道简单模拟题,来做做看!

按奇偶排序数组II

力扣题目链接:https://leetcode-cn.com/problems/sort-array-by-parity-ii/

给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。

对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。

你可以返回任何满足上述条件的数组作为答案。

示例:

思路

这道题目直接的想法可能是两层for循环再加上used数组表示使用过的元素。这样的的时间复杂度是O(n^2)。

方法一

其实这道题可以用很朴实的方法,时间复杂度就就是O(n)了,C++代码如下:

  1. class Solution { 
  2. public
  3.     vector<int> sortArrayByParityII(vector<int>& A) { 
  4.         vector<int> even(A.size() / 2); // 初始化就确定数组大小,节省开销 
  5.         vector<int> odd(A.size() / 2); 
  6.         vector<int> result(A.size()); 
  7.         int evenIndex = 0; 
  8.         int oddIndex = 0; 
  9.         int resultIndex = 0; 
  10.         // 把A数组放进偶数数组,和奇数数组 
  11.         for (int i = 0; i < A.size(); i++) { 
  12.             if (A[i] % 2 == 0) even[evenIndex++] = A[i]; 
  13.             else odd[oddIndex++] = A[i]; 
  14.         } 
  15.         // 把偶数数组,奇数数组分别放进result数组中 
  16.         for (int i = 0; i < evenIndex; i++) { 
  17.             result[resultIndex++] = even[i]; 
  18.             result[resultIndex++] = odd[i]; 
  19.         } 
  20.         return result; 
  21.     } 
  22. }; 

方法二

以上代码我是建了两个辅助数组,而且A数组还相当于遍历了两次,用辅助数组的好处就是思路清晰,优化一下就是不用这两个辅助树,代码如下:

  1. class Solution { 
  2. public
  3.     vector<int> sortArrayByParityII(vector<int>& A) { 
  4.         vector<int> result(A.size()); 
  5.         int evenIndex = 0;  // 偶数下表 
  6.         int oddIndex = 1;   // 奇数下表 
  7.         for (int i = 0; i < A.size(); i++) { 
  8.             if (A[i] % 2 == 0) { 
  9.                 result[evenIndex] = A[i]; 
  10.                 evenIndex += 2; 
  11.             } 
  12.             else { 
  13.                 result[oddIndex] = A[i]; 
  14.                 oddIndex += 2; 
  15.             } 
  16.         } 
  17.         return result; 
  18.     } 
  19. }; 

方法三

当然还可以在原数组上修改,连result数组都不用了。

  1. class Solution { 
  2. public
  3.     vector<int> sortArrayByParityII(vector<int>& A) { 
  4.         int oddIndex = 1; 
  5.         for (int i = 0; i < A.size(); i += 2) { 
  6.             if (A[i] % 2 == 1) { // 在偶数位遇到了奇数 
  7.                 while(A[oddIndex] % 2 != 0) oddIndex += 2; // 在奇数位找一个偶数 
  8.                 swap(A[i], A[oddIndex]); // 替换 
  9.             } 
  10.         } 
  11.         return A; 
  12.     } 
  13. }; 

这里时间复杂度并不是O(n^2),因为偶数位和奇数位都只操作一次,不是n/2 * n/2的关系,而是n/2 + n/2的关系!

其他语言版本

Java

  1. // 方法一 
  2. class Solution { 
  3.     public int[] sortArrayByParityII(int[] nums) { 
  4.         // 分别存放 nums 中的奇数、偶数 
  5.         int len = nums.length; 
  6.         int evenIndex = 0; 
  7.         int oddIndex = 0; 
  8.         int[] even = new int[len / 2]; 
  9.         int[] odd = new int[len / 2]; 
  10.         for (int i = 0; i < len; i++) { 
  11.             if (nums[i] % 2 == 0) { 
  12.                 even[evenIndex++] = nums[i]; 
  13.             } else { 
  14.                 odd[oddIndex++] = nums[i]; 
  15.             } 
  16.         } 
  17.         // 把奇偶数组重新存回 nums 
  18.         int index = 0; 
  19.         for (int i = 0; i < even.length; i++) { 
  20.             nums[index++] = even[i]; 
  21.             nums[index++] = odd[i]; 
  22.         } 
  23.         return nums; 
  24.     } 

Python3

  1. #方法2 
  2. class Solution: 
  3.     def sortArrayByParityII(self, nums: List[int]) -> List[int]: 
  4.         result = [0]*len(nums) 
  5.         evenIndex = 0 
  6.         oddIndex = 1 
  7.         for i in range(len(nums)): 
  8.             if nums[i] % 2: #奇数 
  9.                 result[oddIndex] = nums[i] 
  10.                 oddIndex += 2 
  11.             else: #偶数 
  12.                 result[evenIndex] = nums[i] 
  13.                 evenIndex += 2 
  14.         return result 
  15.  
  16. #方法3 
  17. class Solution: 
  18.     def sortArrayByParityII(self, nums: List[int]) -> List[int]: 
  19.         oddIndex = 1 
  20.         for i in range(0,len(nums),2): #步长为2 
  21.             if nums[i] % 2: #偶数位遇到奇数 
  22.                 while  nums[oddIndex] % 2: #奇数位找偶数 
  23.                     oddIndex += 2 
  24.                 nums[i], nums[oddIndex] = nums[oddIndex], nums[i] 
  25.         return nums 

Go

  1. // 方法一 
  2. func sortArrayByParityII(nums []int) []int { 
  3.  // 分别存放 nums 中的奇数、偶数 
  4.  even, odd := []int{}, []int{} 
  5.  for i := 0; i < len(nums); i++ { 
  6.   if (nums[i] % 2 == 0) { 
  7.    even = append(even, nums[i]) 
  8.   } else { 
  9.    odd = append(odd, nums[i]) 
  10.   } 
  11.  } 
  12.  
  13.  // 把奇偶数组重新存回 nums 
  14.  result := make([]int, len(nums)) 
  15.  index := 0 
  16.  for i := 0; i < len(even); i++ { 
  17.   result[index] = even[i]; index++; 
  18.   result[index] = odd[i]; index++; 
  19.  } 
  20.  return result; 

JavaScript

  1. //方法一 
  2. var sortArrayByParityII = function(nums) { 
  3.     const n = nums.length; 
  4.     // 分别存放 nums 中的奇数、偶数 
  5.     let evenIndex = 0, oddIndex = 0; 
  6.     // 初始化就确定数组大小,节省开销 
  7.     const even = new Array(Math.floor(n/2)); 
  8.     const odd = new Array(Math.floor(n/2)); 
  9.     // 把A数组放进偶数数组,和奇数数组 
  10.     for(let i = 0; i < n; i++){ 
  11.         if(nums[i] % 2 === 0) even[evenIndex++] = nums[i]; 
  12.         else odd[oddIndex++] = nums[i]; 
  13.     } 
  14.     // 把奇偶数组重新存回 nums 
  15.     let index = 0; 
  16.     for(let i = 0; i < even.length; i++){ 
  17.         nums[index++] = even[i]; 
  18.         nums[index++] = odd[i]; 
  19.     } 
  20.     return nums; 
  21. }; 
  22.  
  23. //方法二 
  24. var sortArrayByParityII = function(nums) { 
  25.     const n = nums.length; 
  26.     const result = new Array(n); 
  27.     // 偶数下标 和 奇数下标 
  28.     let evenIndex = 0, oddIndex = 1; 
  29.     for(let i = 0; i < n; i++){ 
  30.         if(nums[i] % 2 === 0) { 
  31.             result[evenIndex] = nums[i]; 
  32.             evenIndex += 2; 
  33.         } else { 
  34.             result[oddIndex] = nums[i]; 
  35.             oddIndex += 2; 
  36.         } 
  37.     } 
  38.     return result; 
  39. }; 
  40.  
  41. //方法三 
  42. var sortArrayByParityII = function(nums) { 
  43.     let oddIndex = 1; 
  44.     for(let i = 0; i < nums.length; i += 2){ 
  45.         if(nums[i] % 2 === 1){ // 在偶数位遇到了奇数 
  46.             while(nums[oddIndex] % 2 !== 0) oddIndex += 2;// 在奇数位找一个偶数 
  47.             [nums[oddIndex], nums[i]] = [nums[i], nums[oddIndex]]; // 解构赋值交换 
  48.         } 
  49.     } 
  50.     return nums; 
  51. }; 

 

来源:代码随想录内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯