public class SearchInShiftedArray {
/**
* 题目:给定一个固定长度的数组,将递增整数序列写入这个数组。当写到数组尾部时,返回数组开始重新写,并覆盖先前写过的数。
* 请在这个特殊数组中找出给定的整数。
* 解答:
* 其实就是“旋转数组”。旋转数组的最小元素见http://bylijinnan.iteye.com/blog/1431531
* 采用类似二分查找的策略。首先比较a[0]和a[N/2],如果a[0] < a[N/2],则说明a[0,1,...,N/2]为递增子序列,否则另一部分是递增子序列。
* 然后判断要找的整数是否在递增子序列范围内。如果在,则使用普通的二分查找方法继续查找;如果不在,则重复上面的查找过程,直到找到或者失败为止。
*
*/
public static void main(String[] args) {
int[][] a={
{1,2,3,4,5},
{2,3,4,5,1},
{3,4,5,1,2},
{4,5,1,2,3},
{5,6,1,2,3,4},
};
for(int[] each:a){
int pos=find(each,0,each.length-1,4);
System.out.println(pos);
}
}
public static int find(int[] data,int low,int high,int target){
if(data==null||data.length==0){
return -1;
}
int len=data.length;
if(!(low>=0&&low<len&&high>=0&&high<len)){//0<=(low,high)<=len-1
return -1;
}
int mid=0;
while(low<=high){
if(data[low]<=data[high]){//if 'data' is already increasing
return binarySearch(data,low,high,target);
}
mid=(low&high)+(low^high)/2;
if(data[low]<=data[mid]){//if the first part is increasing
if(target>=data[low]&&target<=data[mid]){
return binarySearch(data,low,mid,target);
}else{
return find(data,mid,high,target);
}
}
if(data[mid]<=data[high]){//if the second part is increasing
if(target>=data[mid]&&target<=data[high]){
return binarySearch(data,mid,high,target);
}else{
return find(data,low,mid,target);
}
}
}
return -1;
}
public static int binarySearch(int[] data,int low,int high,int target){
if(data==null||data.length==0){
return -1;
}
int mid=0;
while(low<=high){
mid=(low&high)+(low^high)/2;
if(data[mid]==target){
return mid;
}else if(data[mid]<target){
low=mid+1;
}else{
high=mid-1;
}
}
return mid;
}
}
分享到:
相关推荐
数组 - 需要参加面试的人
标题中的“java-leetcode面试题解哈希表第350题两个数组的交集II-题解.zip”指的是一个关于Java编程语言的LeetCode面试题解析,具体是第350题,题目要求解决“两个数组的交集II”的问题,而解题方法主要涉及哈希表的...
标题中的“java-leetcode面试题解哈希表第349题两个数组的交集-题解.zip”表明这是一个关于Java编程语言的LeetCode面试题解答,具体是针对第349题,该题目涉及使用哈希表解决两个数组的交集问题。LeetCode是一个知名...
### 常见数组面试题解析 #### 一、数组求和 **题目描述:** 使用递归方式实现数组求和,并且要求整个函数只使用一行代码。 **解答:** ```cpp int sum(int* a, int n) { return n == 0 ? 0 : sum(a, n - 1) + a...
对于这道题,我们可以设定一个指向数组头部的指针`left`和一个指向数组尾部的指针`right`。 题目要求找到数组中两个数,它们的和等于给定的目标值`target`。由于数组是有序的,我们可以利用这个特性来减少不必要的...
问题要求我们给定一个非负整数数组`nums`,其中`nums`是严格递增的,我们的任务是返回一个新的数组,新数组中的元素是原数组中每个元素的平方值,且新数组也必须按照非降序排列。 **双指针技术:** 双指针是一种...
在一开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在。 缓存击穿是指对于设置了过期时间的key,缓存在某个...
给定一个整数数组`nums`和一个整数`k`,我们需要找出并返回数组中所有乘积小于`k`的连续子数组的个数。子数组是由数组中连续元素组成的序列,而乘积则是子数组中所有元素的乘积。 双指针在这里的应用主要是为了减少...
当其中一个数组遍历完后,如果另一个数组仍有剩余元素,就将其依次添加到nums1的开头,确保所有元素都被正确地合并。 这个算法的时间复杂度为O(m+n),因为它只遍历了一次合并后的数组。空间复杂度为O(1),因为我们...
当一个数组的指针达到其末尾时,我们将另一个数组剩余的元素直接追加到合并后的数组中。 在Java中实现这个解决方案,代码可能如下所示: ```java public class Solution { public void merge(int[] nums1, int m,...
在这个“一维数组题目8道题带答案”资源中,我们可以期待找到一系列与一维数组相关的练习题,旨在帮助学习者理解和熟练掌握在Unity C#环境中操作数组的技巧。 1. **数组的基本概念**: - 一维数组是线性数据结构,...
标题中的“java面试-leetcode面试题解之第34题在排序数组中查找元素的第一个和最后一个位置-java题解”指的是一个关于Java编程的面试准备资料,特别针对LeetCode的第34题。LeetCode是一个在线平台,提供各种编程挑战...
在Java编程领域,LeetCode是一个非常受欢迎的在线平台,它提供了大量的编程题目,帮助开发者提升算法和数据结构技能,同时也是面试准备的重要资源。本题解将深入探讨LeetCode中的第49题——字母异位词分组,这是一道...
- 当迭代结束时,较小数组的最后一个元素(如果长度为偶数则是最后两个元素的平均值)即为中位数。 在实际编程实现时,需要注意边界条件的处理,比如数组为空或只有一个元素的情况。此外,为了提高代码的可读性...
第26题“删除有序数组中的重复项”是一个经典的算法问题,它涉及到数组操作和高效的算法设计。下面我们将深入探讨这个问题,以及如何用Java来解决。 **问题描述:** 给定一个有序数组nums,其中所有元素都是唯一的...
题目是“递增的三元子序列”( Increasing Triplet Subsequence),这是一个典型的算法问题,常出现在数据结构和算法的面试中。下面我们将深入探讨这个问题及其解决方案。 首先,我们要理解什么是三元子序列。在一...
在Java编程领域,LeetCode是一个非常受欢迎的在线平台,它提供了大量的编程题目,帮助开发者提升算法和数据结构技能。在面试准备过程中,LeetCode题目经常作为面试官考察候选人能力的标准。其中,第26题“删除有序...
首先,通过定义一个整型数组a,并对其进行初始化,然后创建一个整型指针ptr,将其指向数组a的首地址后加1的位置。这里需要注意的是,当对数组指针进行加1操作时,实际上是按照数组元素的内存大小进行偏移,本例中为5...
在本压缩包中,我们关注的是一个Java编程相关的学习资源,特别是一道源自LeetCode的面试题,题目编号为217,主题是检查数组中是否存在重复元素。这道题目通常出现在求职面试中,用于测试候选人在算法和数据结构方面...
题目中提到的存在重复元素II,指的是在一个给定的整数数组中,找到一个数字出现次数超过数组长度的1/3的情况。例如,如果数组长度为7,那么至少有一个数字出现了3次或更多次。目标是找出这个重复的数字,如果没有...