From d1cf9e3f758774656441200f19c359f0246725f4 Mon Sep 17 00:00:00 2001 From: colorbox Date: Sat, 22 Aug 2026 19:57:51 +0900 Subject: [PATCH] 35. Search Insert Position https://leetcode.com/problems/search-insert-position/description/ --- 35/step1.cpp | 35 +++++++++++++++++++++++++++++++++++ 35/step2.cpp | 24 ++++++++++++++++++++++++ 35/step3.cpp | 16 ++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 35/step1.cpp create mode 100644 35/step2.cpp create mode 100644 35/step3.cpp 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; + } +};