题目
统计一个数字在排序数组中出现的次数。
示例1
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例2
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
一,C语言
方法1(暴力遍历)
int search(int* nums, int numsSize, int target){
int j=0;
for(int i=0;i<numsSize;i++){
if(nums[i]==target){
j++;
}
}
return j;
}
方法2(在暴力遍历的基础上缩小需要遍历数组的大小)
int search(int* nums, int numsSize, int target){
int left=0,right=numsSize-1;
int count=0;
while(left<right){
int mid=(left+right)/2;
if(nums[mid]>=target)
right=mid;
if(nums[mid]<target)
left=mid+1;
}
for(;left<numsSize;left++){
if(nums[left]==target)
count++;
}
return count;
}
二,Java
class Solution {
public int search(int[] nums, int target) {
int left=0,right=nums.length-1;
int count=0;
while(left<right){
int mid=(left+right)/2;
if(nums[mid]>=target)
right=mid;
if(nums[mid]<target)
left=mid+1;
}
while(left<nums.length&&nums[left++]==target){
count++;
}
return count;
}
解题思路
利用二分法进行查找,首先left与right是左,右边界,mid为中间值,通过mid与target进行比较大小,进而来判断左边界向右移还是右边界向左移,当left大于right时循环结束。
三,Python
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
i, j = 0, len(nums) - 1
while i <= j:
m = (i + j) // 2
if nums[m] <= target: i = m + 1
else: j = m - 1
right = i
# 若数组中无 target ,则提前返回
if j >= 0 and nums[j] != target: return 0
# 搜索左边界 left
i = 0
while i <= j:
m = (i + j) // 2
if nums[m] < target: i = m + 1
else: j = m - 1
left = j
return right - left - 1
题目
给定一个整数数组 arr,如果它是有效的山脉数组就返回 true,否则返回 false。让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组:
arr.length >= 3
在 0 < i < arr.length - 1 条件下,存在 i 使得:
arr[0] < arr[1] < … arr[i-1] < arr[i]
arr[i] > arr[i+1] > … > arr[arr.length - 1]
示例1
输入:arr = [2,1]
输出:false
示例2
输入:arr = [3,5,5]
输出:false
示例3
输入:arr = [0,3,2,1]
输出:true
一,C语言
bool validMountainArray(int* arr, int arrSize) {
int i = 0;
while (i + 1 < arrSize && arr[i] < arr[i + 1]) {
i++;//递增扫描,找到最高峰。
}
if (i == 0 || i == arrSize - 1) {
return false;//最高峰不是第一个位置也不是最后一个位置。
}
while (i + 1 < arrSize && arr[i] > arr[i + 1]) {
i++;//递减扫描。
}
return i == arrSize - 1;
}
二,Java
class Solution {
public boolean validMountainArray(int[] arr) {
int n=arr.length;
if(n<3){
return false;
}
int i=0;
int j=n-1;
while(i+1<n&&arr[i]<arr[i+1]){
i++;
}
while(j-1>=0&&arr[j]<arr[j-1]){
j--;
}
if(i==j&&i!=0&&j!=n-1){
return true;
}
return false;
}
}
解题思路
利用双指针,一个从左边找最高峰,另一个从右边找最高峰,最后判断找到的是不是同一个山峰。
三,Python
class Solution(object):
def validMountainArray(self, arr):
"""
:type arr: List[int]
:rtype: bool
"""
N = len(arr)
i = 0
while i + 1 < N and arr[i] < arr[i + 1]:
i += 1 //递增扫描,找到最高峰。
if i == 0 or i == N - 1: //最高峰不是第一个位置也不是最后一个位置。
return False
while i + 1 < N and arr[i] > arr[i + 1]:
i += 1 //递减扫描。
return i == N - 1