From 1c26430176005b4767c5f0b3e56cc4698ec2145d Mon Sep 17 00:00:00 2001 From: KongJHong Date: Sun, 21 Oct 2018 15:10:36 +0800 Subject: [PATCH 1/3] 033 Solution --- .../README.md | 96 +++++++++++++++++++ .../Solution.cpp | 36 +++++++ 2 files changed, 132 insertions(+) create mode 100644 solution/033.Search in Rotated Sorted Array/README.md create mode 100644 solution/033.Search in Rotated Sorted Array/Solution.cpp diff --git a/solution/033.Search in Rotated Sorted Array/README.md b/solution/033.Search in Rotated Sorted Array/README.md new file mode 100644 index 0000000000000..c1ec00100312e --- /dev/null +++ b/solution/033.Search in Rotated Sorted Array/README.md @@ -0,0 +1,96 @@ +## 搜索旋转排序数组 +### 题目描述 + +假设按照升序排序的数组在预先未知的某个点上进行了旋转。 + +( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 + +搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 + +你可以假设数组中不存在重复的元素。 + +你的算法时间复杂度必须是 O(log n) 级别。 + +``` +示例 1: +输入: nums = [4,5,6,7,0,1,2], target = 0 +输出: 4 +``` + +``` +示例 2: +输入: nums = [4,5,6,7,0,1,2], target = 3 +输出: -1 +``` + + +---------------------- +### 思路: +因为是排序数组,而且要求是log2(n)时间搜索,所以优先选择用二分搜索法,但是这道题的难点就是不知道原数组的旋转位置在哪里,无法从中间值对比过程中直接进行二分搜索 + +我们还是用题目中给的例子来分析,对于数组[0 1 2 4 5 6 7] 共有下列七种旋转方法: + +0  1  2   4  5  6  7 + +7  0  1   **2  4  5  6** + +6  7  0   **1  2  4  5** + +5  6  7   **0  1  2  4** + +**4  5  6  7**  0  1  2 + +**2  4  5  6**  7  0  1 + +**1  2  4  5**  6  7  0 + +二分搜索法的关键点在于,在与中间值进行对比后,大于则在右半部分搜索,小于则在左半部分搜索,反复进行达到收敛。 + +我们观察上面加粗的部分,如果: +中间值比最右值小,则右半部有序递增 +中间值比最右值大,则左半部有序递增 + +通过这个特点,对该数组进行二分搜索 + +```C++ +class Solution { +public: + int search(vector& nums, int target) { + int len = nums.size(); + int left = 0; + int right = len - 1; + int mid; + while(left <= right) { + mid = (left + right) / 2; + if(nums[mid] == target)return mid; + + if(nums[mid] < nums[right]) { + if(nums[right] >= target && nums[mid] < target)left = mid + 1; + else right = mid - 1; + } + else { + if(nums[left] <= target && nums[mid] > target)right = mid - 1; + else left = mid + 1; + } + } + return -1; + } +}; + +``` +------------------------- +我发现其实这种暴力枚举,时间差不了多少,各位赶时间就直接暴力吧!!! + +```C++ +class Solution { +public: + int search(vector& nums, int target) { + int len = nums.size(); + for(int i = 0;i& nums, int target) { + int len = nums.size(); + int left = 0; + int right = len - 1; + int mid; + while(left <= right) { + mid = (left + right) / 2; + if(nums[mid] == target)return mid; + + if(nums[mid] < nums[right]) { + if(nums[right] >= target && nums[mid] < target)left = mid + 1; + else right = mid - 1; + } + else { + if(nums[left] <= target && nums[mid] > target)right = mid - 1; + else left = mid + 1; + } + } + return -1; + } +}; + +--------------- +class Solution { +public: + int search(vector& nums, int target) { + int len = nums.size(); + for(int i = 0;i Date: Sun, 21 Oct 2018 19:15:32 +0800 Subject: [PATCH 2/3] Add CPP solution to the question2 and create new dict for the question33 --- solution/002.Add Two Numbers/Solution.cpp | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 solution/002.Add Two Numbers/Solution.cpp diff --git a/solution/002.Add Two Numbers/Solution.cpp b/solution/002.Add Two Numbers/Solution.cpp new file mode 100644 index 0000000000000..fc01eaebe3bc0 --- /dev/null +++ b/solution/002.Add Two Numbers/Solution.cpp @@ -0,0 +1,37 @@ +class Solution { +public: + ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { + + ListNode *ans_l = new ListNode(0); + ListNode *head = ans_l; + int tmp = 0; + while(l1 != NULL && l2 != NULL){ + tmp += l1->val + l2->val; + ans_l->next = new ListNode(tmp % 10); + tmp = tmp / 10; + ans_l = ans_l->next; + l1 = l1->next; + l2 = l2->next; + } + + while(l1 != NULL){ + tmp += l1->val; + ans_l->next = new ListNode(tmp % 10); + tmp = tmp / 10; + ans_l = ans_l->next; + l1 = l1->next; + } + + while(l2 != NULL){ + tmp += l2->val; + ans_l->next = new ListNode(tmp % 10); + tmp = tmp / 10; + ans_l = ans_l->next; + l2 = l2->next; + } + + if(tmp)ans_l->next = new ListNode(tmp); + + return head->next; + } +}; From 316ab915ef34566a0f7d2251178a97ea16da0747 Mon Sep 17 00:00:00 2001 From: KongJHong Date: Sun, 21 Oct 2018 19:17:26 +0800 Subject: [PATCH 3/3] Add description to question2 --- solution/002.Add Two Numbers/README.md | 43 +++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/solution/002.Add Two Numbers/README.md b/solution/002.Add Two Numbers/README.md index 6e6395efbf9df..b6dd1a3fcaeb9 100644 --- a/solution/002.Add Two Numbers/README.md +++ b/solution/002.Add Two Numbers/README.md @@ -98,4 +98,45 @@ class Solution { return res.next; } } -``` \ No newline at end of file +``` +#### CPP +```CPP +class Solution { +public: + ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { + + ListNode *ans_l = new ListNode(0); + ListNode *head = ans_l; + int tmp = 0; + while(l1 != NULL && l2 != NULL){ + tmp += l1->val + l2->val; + ans_l->next = new ListNode(tmp % 10); + tmp = tmp / 10; + ans_l = ans_l->next; + l1 = l1->next; + l2 = l2->next; + } + + while(l1 != NULL){ + tmp += l1->val; + ans_l->next = new ListNode(tmp % 10); + tmp = tmp / 10; + ans_l = ans_l->next; + l1 = l1->next; + } + + while(l2 != NULL){ + tmp += l2->val; + ans_l->next = new ListNode(tmp % 10); + tmp = tmp / 10; + ans_l = ans_l->next; + l2 = l2->next; + } + + if(tmp)ans_l->next = new ListNode(tmp); + + return head->next; + } +}; + +```