diff --git a/35/step1.cpp b/35/step1.cpp new file mode 100644 index 0000000..2d27602 --- /dev/null +++ b/35/step1.cpp @@ -0,0 +1,35 @@ +/* +Time: 11:13 + +Time Complexity: O(log(n)) +Space Complexity: O(n) + +targetがnumsの中に存在しないパターンの対処に少し時間がかかってしまった。 +*/ +class Solution { +public: + int searchInsert(vector& nums, int target) { + int left = 0; + int right = nums.size(); + int mid; + while (left + 1 < right) { + mid = (left + right) / 2; + if (nums[mid] == target) { + return mid; + } + if (nums[mid] > target) { + right = mid; + continue; + } + if (nums[mid] < target) { + left = mid; + continue; + } + } + if (target <= nums[left]) { + return left; + } else { + return right; + } + } +}; diff --git a/35/step2.cpp b/35/step2.cpp new file mode 100644 index 0000000..0ab4f83 --- /dev/null +++ b/35/step2.cpp @@ -0,0 +1,24 @@ +/* +Time : 03:18 + +他の人のコードとそのレビューを読むことでstep1は認識すべきleft,rightの不変条件をよく理解できていないまま書いていたことがわかった。 +step1のコードはkeft,rightの不変条件などの理解が不十分なまま書かれた結果歪な分岐が末尾に出現している。 +二分探索の理解が少し深まった。 + +*/ +class Solution { +public: + int searchInsert(vector& nums, int target) { + int left = 0; + int right = nums.size(); + while (left < right) { + int mid = left + (right - left) / 2; + if (nums[mid] >= target) { + right = mid; + } else { + left = mid + 1; + } + } + return left; + } +}; diff --git a/35/step3.cpp b/35/step3.cpp new file mode 100644 index 0000000..293d815 --- /dev/null +++ b/35/step3.cpp @@ -0,0 +1,16 @@ +class Solution { +public: + int searchInsert(vector& nums, int target) { + int left = 0; + int right = nums.size(); + while (left < right) { + int mid = left + (right - left) / 2; + if (target <= nums[mid]) { + right = mid; + } else { + left = mid + 1; + } + } + return left; + } +};