题目三: 数组中数值和下标相等的元素. 假设一个单调递增的数组里的每个元素都是整数并且是唯一的.请编程实现一个函数,找出数组中任意一个数值等于其下标的元素.例如,在数组{-3,-1,1,3,5}中,数字3和它的下标相等. 题解: 使用二分法,下角标小于其值,目标值在左边,下角标大于其值,目标值在右边. int findThatNum(const vector<int>&data) { ); , R = data.size() - , M; && R < data.…
  本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 假设一个单调递增的数组里的每个元素都是整数并且是唯一的.请编程实现一个函数找出数组中任意一个数值等于其下标的元素.例如,在数组{-3, -1,1, 3, 5}中,数字3和它的下标相等. 思路 同53-1和53-2一样,不再从头到尾遍历,由于是排序数组,我们继续考虑使用二分查找算法:   1)当中间数字等于其下标时,中间数字即为所求数字:   2)当中间数字大于其下标时,…
// 面试题53(三):数组中数值和下标相等的元素 // 题目:假设一个单调递增的数组里的每个元素都是整数并且是唯一的.请编程实 // 现一个函数找出数组中任意一个数值等于其下标的元素.例如,在数组{-3, -1, // 1, 3, 5}中,数字3和它的下标相等. //思想:因为这里也是递增的,如果中间点的值大于下标,那后面所有值都会大于相应下标,同理中间点小于下标,前面都会小于下标 #include <iostream> int GetNumberSameAsIndex(const int*…
剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次.请找出数组中任意一个重复的数字. 示例 1: 输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 思路 哈希表法: 由于只需要找出数组中任意一个重复的数字,因此遍历数组,遇到重复的数字即返回.为了判断一个数字是否重复遇到,使用集合存储已经遇到的数字,如果遇到的…
剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这个数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 解法一:基于Partition函数时间复杂度为O(n)的算法 简要思路 数组中有一个数字出现的次数超过了数组长度的一半.如果把这个数组排序,那么排序之后位于数组中间的数字一定就是那个出现次数超过数组长度一半的数字.也就是说,这个数字就是统…
本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指offer>书上,采用了异或的方式,未详看. 思路二:在python中,将第一个数据放入其中,从第二个开始遍历,如果已经存在缓存中,那么就去除掉,否则就加入其中,遍历一次的时间复杂为O(n),空间复杂度为O(1)常熟级别的. C++ Code: Python Code: # -*- coding:utf-8…
剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/9 9:12 */ /** * 题目详情:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对. * 输入一个数组,求出这个数组中的逆序对的总数. */ import java.util.Arrays; /** * 方法一:暴…
剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majorityElement(int[] nums) { Map<Integer,Integer> map = new HashMap<>(); int len = nums.length; int ans = -1; for(int num : nums){ int cnt = 0; if…
剑指 Offer 03. 数组中重复的数字 哈希表/set class Solution { public int findRepeatNumber(int[] nums) { HashSet<Integer> set = new HashSet<>(); for(int num : nums){ if(set.contains(num)) return num; set.add(num); } return -1; } } 思路:利用set的特性 原地置换 class Solut…
剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 一.摩尔算法 具体摩尔算法,我借鉴一下大神的解释更好理解点. 为什么答案能写那么长呢...核心就是对拼消耗.玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干…