首页 > 编程语言 >算法训练营——双指针问题

算法训练营——双指针问题

时间:2023-03-21 10:37:18浏览次数:45  
标签:return int max 训练营 ++ 算法 nums1 nums2 指针


​349. 两个数组的交集​

这个是保留所有的重复的数组还有一种的只是保留一种的结果的

算法训练营——双指针问题_数组

package 计算机程序算法分类.双指针问题;

import java.util.*;

/**
* @Classname 两个数组的交集
* @Description TODO
* @Date 2021/4/12 21:18
* @Created by xjl
*/
public class 两个数组的交集 {
/**
* @description TODO 采用的是的双指针来实现 这个题目是知识保留一份的结果
* @param: nums1
* @param: nums2
* @date: 2021/4/13 14:05
* @return: int[]
* @author: xjl
*/
public int[] intersect(int[] nums1, int[] nums2) {
// 先对两个数组进行排序
Arrays.sort(nums1);//时间复杂度为O(nlog(n))
Arrays.sort(nums2);
int i = 0;
int j = 0;
//存放的结果
HashSet<Integer> set = new HashSet<>();
while (i < nums1.length && j < nums2.length) {
if (nums1[i] < nums2[j]) {
i++;
} else if (nums1[i] > nums2[j]) {
j++;
} else {
set.add(nums1[i]);
i++;
j++;
}
}
ArrayList<Integer> list = new ArrayList<>(set);
return list.stream().mapToInt(Integer::intValue).toArray();
}

/**
* @description TODO 这个题目是知识保留一份的结果
* @param: nums1
* @param: nums2
* @date: 2021/4/13 14:41
* @return: int[]
* @author: xjl
*/
public int[] intersection(int[] nums1, int[] nums2) {
ArrayList<Integer> result = new ArrayList();
ArrayList<Integer> list = new ArrayList<>();
for (int i : nums1) {
list.add(i);
}
for (int i : nums2) {
if (list.contains(i)&&!result.contains(i)) {
result.add(i);
}
}
return result.stream().mapToInt(Integer::intValue).toArray();
}

/**
* @description TODO 采用的是的双指针来实现 保留所有的重复的结果
* @param: nums1
* @param: nums2
* @date: 2021/4/13 14:05
* @return: int[]
* @author: xjl
*/
public int[] intersect_2(int[] nums1, int[] nums2) {
// 先对两个数组进行排序
Arrays.sort(nums1);//时间复杂度为O(nlog(n))
Arrays.sort(nums2);
int i = 0;
int j = 0;
//存放的结果
List<Integer> list = new ArrayList<>();
while (i < nums1.length && j < nums2.length) {
if (nums1[i] < nums2[j]) {
i++;
} else if (nums1[i] > nums2[j]) {
j++;
} else {
list.add(nums1[i]);
i++;
j++;
}
}
return list.stream().mapToInt(Integer::intValue).toArray();
}
}

​424. 替换后的最长重复字符​​(没有太理解)

  • 右边界先移动找到一个满足题意的可以替换 k 个字符以后,所有字符都变成一样的当前看来最长的子串,直到右边界纳入一个字符以后,不能满足的时候停下;
  • 然后考虑左边界向右移动,左边界只须要向右移动一格以后,右边界就又可以开始向右移动了,继续尝试找到更长的目标子串;
  • 替换后的最长重复子串就产生在右边界、左边界交替向右移动的过程中。
package 计算机程序算法分类.双指针问题;

import leetcode练习题.reverse;
import org.junit.Test;
import 牛客网练习题.Solution;

import java.util.HashMap;

/**
* @Classname 最长字符串
* @Description TODO
* @Date 2021/4/13 14:22
* @Created by xjl
*/
public class 替换的最长的重复字符 {
public int characterReplacement(String s, int k) {
int len = s.length();
if (len < 2) {
return len;
}

char[] charArray = s.toCharArray();
int left = 0;
int right = 0;

int res = 0;
int maxCount = 0;
int[] freq = new int[26];
// [left, right) 内最多替换 k 个字符可以得到只有一种字符的子串

while (right < len) {
freq[charArray[right] - 'A']++;
// 在这里维护 maxCount,因为每一次右边界读入一个字符,字符频数增加,才会使得 maxCount 增加
maxCount = Math.max(maxCount, freq[charArray[right] - 'A']);
right++;

if (right - left > maxCount + k) {
// 说明此时 k 不够用
// 把其它不是最多出现的字符替换以后,都不能填满这个滑动的窗口,这个时候须要考虑左边界向右移动
// 移出滑动窗口的时候,频数数组须要相应地做减法
freq[charArray[left] - 'A']--;
left++;
}
res = Math.max(res, right - left);
}
return res;
}
}

​剑指 Offer 48. 最长不含重复字符的子字符串​

我们使用两个指针,一个i一个j,最开始的时候i和j指向第一个元素,然后i往后移,把扫描过的元素都放到map中,如果i扫描过的元素没有重复的就一直往后移,顺便记录一下最大值max,如果i扫描过的元素有重复的,就改变j的位置,我们就以pwwkew为例画个图看一下

算法训练营——双指针问题_数组_02

算法训练营——双指针问题_双指针_03

public int lengthOfLongestSubstring(String s) {
if (s.length() == 0)
return 0;
HashMap<Character, Integer> map = new HashMap<>();
int max = 0;
for (int i = 0, j = 0; i < s.length(); ++i) {
if (map.containsKey(s.charAt(i))) {
j = Math.max(j, map.get(s.charAt(i)) + 1);
}
map.put(s.charAt(i), i);
max = Math.max(max, i - j + 1);
}
return max;
}

 

标签:return,int,max,训练营,++,算法,nums1,nums2,指针
From: https://blog.51cto.com/u_13643065/6139639

相关文章

  • 算法问题——滑动窗口(双指针问题)
    双指针的问题一种的体现就是的滑动窗口。​​424.替换后的最长重复字符​​ ​​1004.最大连续1的个数III​​ ​​1208.尽可能使字符串相等​​ ​​1493.删掉一......
  • react的diff算法
    diff策略React用三大策略将O(n^3)复杂度转化为O(n)复杂度策略一(treediff):WebUI中DOM节点跨层级的移动操作特别少,可以忽略不计。策略二(componentdiff):拥有相......
  • C++温故补缺(六):友元函数、内联函数和this指针
    友元函数、内联函数和this指针友元函数友元函数是定义在类的外部,但有权访问类的所有私有(private)和保护(protectd)成员.友元函数的原型在类的定义中出现,但它并不是类......
  • Java算法01
    冒泡排序将大的数往后排 packageScanner; importjava.util.*; publicclassDemo04{  publicstaticvoidmain(String[]args){ Scannersan=newScanner(......
  • 【数据结构与算法】堆与堆排序
    堆与堆排序1堆的概念堆用于维护一个数集。堆是一个完全二叉树小根堆:每个结点都小于等于它的左右子结点(递归定义)推论:每个结点都是以其为根节点的子树的最小值......
  • 算法笔记的笔记——第4章 算法初步
    排序选择排序(简单选择排序)从1到n进行n趟操作每趟从待排序部分(i到n)选择最小元素与待排序部分第一个元素(i)交换复杂度O(n2)for(inti=0;i<n;i++){ intk=i;......
  • 算法笔记的笔记——第5章 数学问题
    简单数学略最大公约数与最小公倍数最大公约数intgcd(inta,intb){if(b==0){returna;}else{returngcd(b,a%b);}}......
  • Boruvka 算法简记
    这个算法怕是只会存在于模拟赛里了。Boruvka算法是用于解决完全图的生成树的一类算法,因为完全图边数很多,因此普通时间复杂度基于边数的做法不适用。Boruvka算法核心思想......
  • [算法课]全面翻新计划!第二周全解
    文章目录​​上课内容​​​​试题A:组队​​​​数据​​​​详细分析​​​​颜老板版本暴力枚举​​​​吐槽​​​​更新版​​​​思路​​​​枚举版本​​​​思路......
  • [算法课]全面翻新计划!第十一周全解
    文章目录​​上课内容​​​​贪心法​​​​例1兑换货币​​​​颜老板代码​​​​更新版​​​​测试数据​​​​博主提示:​​​​注意:​​​​贪心算法的思路:​​​​......