티스토리 뷰
Problem
There is an integer array nums sorted in non-decreasing order (not necessarily with distinct values).
Before being passed to your function, nums is rotated at an unknown pivot index k (0 <= k < nums.length) such that the resulting array is [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]] (0-indexed). For example, [0,1,2,4,4,4,5,6,6,7] might be rotated at pivot index 5 and become [4,5,6,6,7,0,1,2,4,4].
Given the array nums after the rotation and an integer target, return true if target is in nums, or false if it is not in nums.
You must decrease the overall operation steps as much as possible.
Example 1:
Input: nums = [2,5,6,0,0,1,2], target = 0
Output: true
Example 2:
Input: nums = [2,5,6,0,0,1,2], target = 3
Output: false
Constraints:
- 1 <= nums.length <= 5000
- -10^4 <= nums[i] <= 10^4
- nums is guaranteed to be rotated at some pivot.
- -10^4 <= target <= 10^4
Solution
감소하지 않는 순서로 정렬된 정수배열이 있습니다. 그리고 이 배열은 k번만큼 rotate 되어있습니다.
rotate된 배열과 target 정수가 주어질 때 target 정수가 배열에 포함되어있는지 여부를 반환하는 문제입니다.
단순 반환만 하는 것은 매우 쉬운 일이기 때문에 연산을 최소한으로 줄여야한다는 조건이 붙어있습니다.
rotate 되어있는 것과 상관없이 이진 탐색을 통해 답을 찾아낼 수 있습니다.
public class Solution {
public boolean search(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return false;
}
if (nums.length == 1) {
return target == nums[0];
}
int left = 0, right = nums.length - 1, mid;
while (left <= right) {
mid = (left + right) / 2;
if (nums[mid] == target) {
return true;
}
if (nums[left] < nums[mid]) {
if (nums[left] <= target && target < nums[mid]) {
right = mid - 1;
} else {
left = mid + 1;
}
} else if (nums[left] > nums[mid]) {
if (nums[mid] < target && target <= nums[right]) {
left = mid + 1;
} else {
right = mid - 1;
}
} else {
left++;
}
}
return false;
}
}
Test
package io.lcalmsky.leetcode.search_in_rotated_sorted_array_ii;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
class SolutionTest {
@Test
void givenRotatedSortedArray_whenSearch_thenCorrect() {
assertAll(
() -> test(new int[]{2, 5, 6, 0, 0, 1, 2}, 0, true),
() -> test(new int[]{2, 5, 6, 0, 0, 1, 2}, 3, false)
);
}
private void test(int[] givenArray, int givenTarget, boolean expected) {
// when
Solution solution = new Solution();
boolean actual = solution.search(givenArray, givenTarget);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
897. Increasing Order Search Tree (0) | 2022.04.30 |
---|---|
669. Trim a Binary Search Tree (0) | 2022.04.29 |
700. Search in a Binary Search Tree (0) | 2022.04.27 |
991. Broken Calculator (0) | 2022.04.26 |
289. Game of Life (0) | 2022.04.25 |
- Total
- Today
- Yesterday
- Java
- 알고리즘
- 스프링 부트 튜토리얼
- @ManyToOne
- 함께 자라기 후기
- spring boot app
- QueryDSL
- Spring Boot Tutorial
- gRPC
- JPA
- 스프링부트
- Jackson
- Spring Data JPA
- r
- 헥사고날 아키텍처
- Linux
- 스프링 데이터 jpa
- 클린 아키텍처
- spring boot application
- proto3
- Spring Boot
- 함께 자라기
- 스프링 부트 애플리케이션
- 스프링 부트 회원 가입
- 스프링 부트
- spring boot jwt
- JSON
- leetcode
- Spring Boot JPA
- intellij
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |