From 42e55ae012b731c652b0645411123d0b562e786f Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Fri, 10 May 2019 20:54:18 -0600 Subject: [PATCH] day 257: smallest window to sort entire --- day257/problem.go | 26 ++++++++++++++++++++++++++ day257/problem_test.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 day257/problem.go create mode 100644 day257/problem_test.go diff --git a/day257/problem.go b/day257/problem.go new file mode 100644 index 0000000..f73a710 --- /dev/null +++ b/day257/problem.go @@ -0,0 +1,26 @@ +package day257 + +// SmallestWindowThatMustBeSorted returns the smallest window that must be +// sorted to result in a completely sorted slice. +func SmallestWindowThatMustBeSorted(nums []int) (start, end int) { + maxSoFar := -int(^uint(0)>>1) - 1 + for i := range nums { + if maxSoFar < nums[i] { + maxSoFar = nums[i] + } + if nums[i] < maxSoFar { + end = i + } + } + minSoFar := int(^uint(0) >> 1) + for i := range nums { + j := len(nums) - 1 - i + if minSoFar > nums[j] { + minSoFar = nums[j] + } + if nums[j] > minSoFar { + start = j + } + } + return +} diff --git a/day257/problem_test.go b/day257/problem_test.go new file mode 100644 index 0000000..a393976 --- /dev/null +++ b/day257/problem_test.go @@ -0,0 +1,28 @@ +package day257 + +import "testing" + +// nolint +var testcases = []struct { + nums []int + start, end int +}{ + {[]int{3, 7, 5, 6, 9}, 1, 3}, +} + +func TestSmallestWindowThatMustBeSorted(t *testing.T) { + t.Parallel() + for _, tc := range testcases { + if start, end := SmallestWindowThatMustBeSorted(tc.nums); start != tc.start || end != tc.end { + t.Errorf("Expected (%v,%v), got (%v,%v)", tc.start, tc.end, start, end) + } + } +} + +func BenchmarkSmallestWindowThatMustBeSorted(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, tc := range testcases { + SmallestWindowThatMustBeSorted(tc.nums) + } + } +}