diff --git a/find-minimum-in-rotated-sorted-array/jaejeong1.java b/find-minimum-in-rotated-sorted-array/jaejeong1.java new file mode 100644 index 000000000..fc1b9cd4f --- /dev/null +++ b/find-minimum-in-rotated-sorted-array/jaejeong1.java @@ -0,0 +1,23 @@ +class Solution { + public int findMin(int[] nums) { + // TC: O(log N) + // SC: O(1) + var left = 1; // N번 회전해 이미 오름차순 정렬일 경우 0으로 시작하면 루프가 안끝남. 1로 시작 + var right = nums.length-1; + + while (left <= right) { // left가 right보다 작거나 같을때까지 + var mid = (left + right) / 2; + if (nums[mid - 1] > nums[mid]) { // mid - 1 요소가 mid 보다 값이 크면 변곡점을 찾은 것. 그대로 반환 + return nums[mid]; + } + + if (nums[mid] > nums[0]) { // 변곡점이 아니고, 0번째 인덱스보다 mid 요소가 값이 크면 정렬이 잘 되어 있는것. 오른쪽으로 탐색 + left = mid + 1; + } else { + right = mid - 1; + } + } + + return nums[0]; // N번 회전해 이미 오름차순 정렬일 경우 0번째 인덱스 요소 반환 + } +} diff --git a/linked-list-cycle/jaejeong1.java b/linked-list-cycle/jaejeong1.java new file mode 100644 index 000000000..a50b0e09d --- /dev/null +++ b/linked-list-cycle/jaejeong1.java @@ -0,0 +1,46 @@ +//Definition for singly-linked list. +class ListNode { + int val; + ListNode next; + ListNode(int x) { + val = x; + next = null; + } +} + +class Solution { + public boolean hasCycle(ListNode head) { + // 풀이 1: Set에 객체를 집어 넣고, 사이즈가 안늘어나면 사이클이 있다고 판단할 수 있다 + // TC: O(N) + // SC: O(N) +// Set set = new HashSet<>(); +// +// while(head != null) { +// var before = set.size(); +// set.add(head); +// var after = set.size(); +// if (before == after) { +// return true; +// } +// head = head.next; +// } +// +// return false; + + // 풀이 2: 두개의 포인터를 사용해 첫번째 포인터는 하나씩, 두번째 포인터는 두개씩 순환하다 겹치는 부분이 생기면 순환이라고 판단할 수 있다 + // TC: O(N) + // SC: O(1) + var slow = head; + var fast = head; + while (fast != null && fast.next != null) { + slow = slow.next; + fast = fast.next.next; + + if (slow == fast) { + return true; + } + } + + return false; + } +}