class Solution {
public int findInMountainArray(int target, MountainArray mountainArr) {
MtA mta = new MtA(mountainArr);
int TopIndex = getTopIndex(mta);
int res = exist1(mta, 0, TopIndex, target);
if(res != -1){
return res;
}
res = exist2(mta, TopIndex, mta.length() - 1, target);
if(res != -1){
return res;
}
return -1;
}
public int exist1(MtA mta, int begin, int end, int target){
if(begin > end){
return -1;
}else{
int mid_index = (begin + end) / 2;
if(mta.get(mid_index) == target){
return mid_index;
}else if(mta.get(mid_index) < target){
return exist1(mta, mid_index + 1, end, target);
}else{
return exist1(mta, begin, mid_index - 1, target);
}
}
}
public int exist2(MtA mta, int begin, int end, int target){
if(begin > end){
return -1;
}else{
int mid_index = (begin + end) / 2;
if(mta.get(mid_index) == target){
return mid_index;
}else if(mta.get(mid_index) > target){
return exist2(mta, mid_index + 1, end, target);
}else{
return exist2(mta, begin, mid_index - 1, target);
}
}
}
public int getTopIndex(MtA mta){
if(mta.get(mta.length() - 1) > mta.get(mta.length() - 2)){
return mta.length() - 1;
}else if(mta.get(0) > mta.get(1)){
return 0;
}else{
return getTopIndexCore(mta, 0, mta.length() - 1);
}
}
public int getTopIndexCore(MtA mta, int begin, int end){
if(begin == end - 1){
if(begin == 0){
return end;
}else{
return end - 1;
}
}
int mid_index = (begin + end) / 2;
if(mta.get(mid_index - 1) < mta.get(mid_index) && mta.get(mid_index) < mta.get(mid_index + 1)){
return getTopIndexCore(mta, mid_index + 1, end);
}else if(mta.get(mid_index - 1) > mta.get(mid_index) && mta.get(mid_index) > mta.get(mid_index + 1)) {
return getTopIndexCore(mta, begin, mid_index - 1);
}else{
return mid_index;
}
}
public class MtA{
private MountainArray mem_Mountain;
private int[] mem_int;
private boolean[] mem_bool;
public MtA(MountainArray a){
mem_Mountain = a;
mem_bool = new boolean[a.length()];
mem_int = new int[a.length()];
}
public int get(int index){
if(mem_bool[index] == false){
mem_bool[index] = true;
mem_int[index] = mem_Mountain.get(index);
}
return mem_int[index];
}
public int length(){
return mem_Mountain.length();
}
}
}
改进版
class Solution {
public int findInMountainArray(int target, MountainArray mountainArr) {
MtA mta = new MtA(mountainArr);
int TopIndex = findPeak(mta);
int res = exist1(mta, 0, TopIndex, target);
if(res != -1){
return res;
}
res = exist2(mta, TopIndex, mta.length() - 1, target);
if(res != -1){
return res;
}
return -1;
}
public static int findPeak(MtA mta){
int begin = 0;
int end = mta.length() - 2;
while(begin < end - 1){
int mid_index = (begin + end) / 2;
if(mta.get(mid_index) < mta.get(mid_index + 1)){
begin = mid_index + 1;
}else{
end = mid_index;
}
}
if(mta.get(begin) > mta.get(end)){
return begin;
}else{
return end;
}
}
public int exist1(MtA mta, int begin, int end, int target){
if(begin > end){
return -1;
}else{
int mid_index = (begin + end) / 2;
if(mta.get(mid_index) == target){
return mid_index;
}else if(mta.get(mid_index) < target){
return exist1(mta, mid_index + 1, end, target);
}else{
return exist1(mta, begin, mid_index - 1, target);
}
}
}
public int exist2(MtA mta, int begin, int end, int target){
if(begin > end){
return -1;
}else{
int mid_index = (begin + end) / 2;
if(mta.get(mid_index) == target){
return mid_index;
}else if(mta.get(mid_index) > target){
return exist2(mta, mid_index + 1, end, target);
}else{
return exist2(mta, begin, mid_index - 1, target);
}
}
}
public class MtA{
private MountainArray mem_Mountain;
private int[] mem_int;
private boolean[] mem_bool;
public MtA(MountainArray a){
mem_Mountain = a;
mem_bool = new boolean[a.length()];
mem_int = new int[a.length()];
}
public int get(int index){
if(mem_bool[index] == false){
mem_bool[index] = true;
mem_int[index] = mem_Mountain.get(index);
}
return mem_int[index];
}
public int length(){
return mem_Mountain.length();
}
}
}