teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

追記

2020/06/21 23:23

投稿

episteme
episteme

スコア16612

answer CHANGED
@@ -29,4 +29,44 @@
29
29
  for ( int item : result ) { std::cout << item << ' '; }
30
30
  std::cout << std::endl;
31
31
  }
32
+ ```
33
+ [追記] 題意に沿ってみた。std::rotateだけは使わせてね♪
34
+ ```C++
35
+ #include <iostream>
36
+ #include <vector>
37
+ #include <algorithm>
38
+
39
+ class Solution {
40
+ public:
41
+ void merge(std::vector<int>& nums1, int m, std::vector<int>& nums2, int n) {
42
+ std::vector<int>::iterator first1 = nums1.begin();
43
+ std::vector<int>::iterator last1 = first1 + m;
44
+ std::vector<int>::iterator first2 = nums2.begin();
45
+ std::vector<int>::iterator last2 = first2 + n;
46
+ // 両方要素があるうちは小さい方を積む
47
+ while ( first1 != last1 && first2 != last2 ) {
48
+ if ( *first1 < *first2 ) {
49
+ // 1側を積むのは"次へ進む"だけ
50
+ ++first1;
51
+ } else {
52
+ // 2側を積むのはちょっと面倒、1側の末尾に積んでくるっと回転
53
+ *last1 = *first2++;
54
+ std::rotate(++first1, last1, last1+1);
55
+ ++last1;
56
+ }
57
+ }
58
+ // 残った2側を全部積む
59
+ while( first2 != last2 ) { *last1++ = *first2++; }
60
+ }
61
+ };
62
+
63
+ int main() {
64
+
65
+ std::vector<int> nums1 = { 1, 2, 3, 0, 0, 0 };
66
+ std::vector<int> nums2 = { 2, 5, 6 };
67
+ Solution s;
68
+ s.merge(nums1, 3, nums2, 3);
69
+ for (int item : nums1 ) { std::cout << item << ' '; }
70
+ std::cout << std::endl;
71
+ }
32
72
  ```