局部最小值位置、元素最左出现、循环有序数组最小值


局部最小值位置

定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0] < arr[1],那么arr[0]是局部最小;如果arr[N-1]< arr[N-2],那么arr[N-1]是局部最小;如果0 < i < N-1,既有arr[i]< arr[i-1]又有arr[i] < arr[i+1],那么arr[i]是局部最小。给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任意一个局部最小出现的位置即可。

这里写图片描述

参考答案

public class Solution {
    public int getLessIndex(int[] arr) {
        if (arr == null || arr.length == 0) {
            return -1; // no exist
        }
        if (arr.length == 1 || arr[0] < arr[1]) {
            return 0;
        }
        if (arr[arr.length - 1] < arr[arr.length - 2]) {
            return arr.length - 1;
        }
        int left = 1;
        int right = arr.length - 2;
        int mid = 0;
        while (left < right) {
            mid = (left + right) / 2;
            if (arr[mid] > arr[mid - 1]) {
                right = mid - 1;
            } else if (arr[mid] > arr[mid + 1]) {
                left = mid + 1;
            } else {
                return mid;
            }
        }
        return left;
    }
}

元素最左出现

对于一个有序数组arr,再给定一个整数num,请在arr中找到num这个数出现的最左边的位置。

给定一个数组arr及它的大小n,同时给定num。请返回所求位置。若该元素在数组中未出现,请返回-1。

# 测试样例:
[1,2,3,3,4],5,3
# 返回:2

我的提交

# -*- coding:utf-8 -*-

class LeftMostAppearance:
    def findPos(self, arr, n, num):
        # write code here
        if n <= 0:
            return -1
        if n == 1 and arr[0] == num:
            return 0
        if arr[0] > num:
            return -1
        if arr[n-1] < num:
            return -1

        left = 0
        right = n-1
        while left < right:
            print(str(left) + " : " + str(right) + " -->   " + str(arr[left:right+ 1]))
            mid = left + (right - left)// 2
            if  num < arr[mid]:
                right = mid - 1
            elif num > arr[mid]:
                left = mid + 1
            else:
                right = mid
        print(str(left) + " : " + str(right) + " -->   " + str(arr[left:right+ 1]))
        print()
        if arr[left] == num:
            return left
        return -1

if __name__ == '__main__':
    left = LeftMostAppearance()
    print(left.findPos([1,2,3,3,4],5,3))

参考答案

class LeftMostAppearance:
    def findPos(self, arr, n, num):
        res = -1
        lft = 0
        rgt = n - 1

        while lft <= rgt:
            mid = lft + (rgt - lft) / 2
            if arr[mid] < num:
                lft = mid + 1
            elif arr[mid] > num:
                rgt = mid - 1
            else:
                res = mid
                rgt = rgt - 1
        return res

循环有序数组最小值

对于一个有序循环数组arr,返回arr中的最小值。有序循环数组是指,有序数组左边任意长度的部分放到右边去,右边的部分拿到左边来。比如数组[1,2,3,3,4],是有序循环数组,[4,1,2,3,3]也是。

给定数组arr及它的大小n,请返回最小值。

#测试样例:
[4,1,2,3,3],5
#返回:1

我的提交

# -*- coding:utf-8 -*-

class MinValue:
    def getMin(self, arr, n):
        # write code here
        left = 0
        right = n - 1
        if arr[left] < arr[right]:
            return arr[left]

        while left < right:
            mid = left + (right - left) // 2
            if arr[left] > arr[mid]:
                right = mid
            elif arr[mid] < arr[right]:
                left = mid
            else:
                mindex = left
                for i in range(left, right + 1):
                    if arr[i] < arr[mindex]:
                        mindex = i
                return arr[mindex]

参考答案

import java.util.*;

public class MinValue {
    public int getMin(int[] arr,int n) {
        if (arr == null || arr.length == 0) {
                return -1;
        }
        int low = 0;
        int high = arr.length - 1;
        int mid = 0;
        while (low < high) {
            if (low == high - 1) {
                break;
            }
            if (arr[low] < arr[high]) {
                return arr[low];
            }
            mid = (low + high) / 2;
            if (arr[low] > arr[mid]) {
                high = mid;
                continue;
            }
            if (arr[mid] > arr[high]) {
                low = mid;
                continue;
            }
            while (low < mid) {
                if (arr[low] == arr[mid]) {
                    low++;
                } else if (arr[low] < arr[mid]) {
                    return arr[low];
                } else {
                    high = mid;
                    break;
                }
            }
        }
        return Math.min(arr[low], arr[high]);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值