C++LeetCode数据结构基础详解
一、只出现一次的数字遍历一遍数组利用异或的特性来实现相同为0相异为1 例如[4,1,2,1,2] 4和1异或为5 5和2异或为7 7和1异或为6 6和2异或为4 这样就能找出唯一的数字了1234567publicintsingleNumber(int[] nums) {intres0;for(inti0;inums.length;i){resres^nums[i];}returnres;}二、多数元素这题可以利用排序就返回中间位置元素就是数量超过一半的数字但是时间复杂度为O(nlogn),利用摩尔投票法实现遍历一遍数组就能找到多数元素具体实现定义两个变量计数位和标记位将计数位初始化为1 将标记位为数组第一个元素 如图[2,2,1,1,1,2,2]1234567891011121314151617publicintmajorityElement(int[] nums) {//摩尔投票法 也叫同归于尽法intcount1;intresnums[0];for(inti1;inums.length;i){if(resnums[i]){count;}else{count--;if(count0){resnums[i];count1;}}}returnres;}三、三数之和三数之和有点类似与两数之和但是难度确增加了不少思路是先对数组进行排序之后定义双指针**左指针为i1,右指针为最后一个数组元素进行求和找和第一个数字相等的数**1234567891011121314151617181920212223242526272829303132publicListListInteger threeSum(int[] nums) {//排序加双指针Arrays.sort(nums);List ListInteger listnewArrayList();if(numsnull||nums.length3){returnlist;}for(inti0;inums.length-2;i){if(nums[i]0){break;}if(i0nums[i]nums[i-1]){//去掉重复元素continue;}intlefti1;intrightnums.length-1;while(leftright){inttemp-nums[i];if(nums[left]nums[right]temp){list.add(newArrayList(Arrays.asList(nums[i], nums[left], nums[right])));left;right--;while(leftrightnums[left]nums[left-1]) left;while(leftrightnums[right]nums[right1]) right--;}elseif(nums[left]nums[right]temp){right--;}else{left;}}}returnlist;}注意1 .给数组排序之后判断元素是否大于0大于直接返回后面元素一定大于02. 去掉重复的元素如果值相同继续指针移动3. Arrays.asList() 是将数组转换成List集合的方法
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2565856.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!