双指针
双指针
Huiex胖子君
广告位招租
展开
-
剑指 Offer 03. 数组中重复的数字
用HashMap的解法就不多说了另一种解法 原地交换 空间复杂度为1 public int findRepeatNumber(int[] nums) { /** 如果该数组没有重复的数时,每一个索引都对应着唯一的那个数 * 但是现在一个数对应多个索引 * 通过交换,使索引和数值一一对应,做到类似于字典的作用*/ int i = 0; while (i < nums.length){原创 2021-11-24 19:41:55 · 280 阅读 · 0 评论 -
剑指 Offer 58
思路注解里面都有了主要还是主要跳出循环的条件,还有最后输出的时候要把最后的空格除去字符串用的方法也要注意/** 创建一个字符串存放结果字符串*/ StringBuffer str = new StringBuffer(); /** 先删除首尾的空格*/ s.trim(); /** 两个指针,都指向最后一个字母*/ int i = s.length()-1; int j = s.length()-1原创 2021-11-17 20:50:59 · 58 阅读 · 0 评论 -
剑指 Offer 57 - II
第一次做滑动窗口,看的题解做的,其实本质还是双指针;思想就是下面的图,主要还是里面有一点细节,比如循环终止条件、数组添加元素、集合转化为数组public int[][] findContinuousSequence(int target) { /** 定义一个集合用来存放结果数组*/ ArrayList<int[]> list = new ArrayList<>(); /** 定义两个指针,从头开始,因为题目要求是至少包含两个数原创 2021-11-17 15:14:54 · 89 阅读 · 6 评论 -
剑指 Offer 22. 链表中倒数第k个节点
这个题目的主要问题就是怎么找到目标结点的位置当然可以用两次遍历,第一遍确定位置,第二遍找到可以定义一个指针指向链表开始的后面的第K个位置,那么从头结点到k,也就是0到k这端就相当于一个气泡,两个指针向后移,当k出去时(指向k的指针指向null,也就是出链表了),那么前面的指针指向的就是目标结点,就好像一个气泡往上浮(我愿称之为冒泡算法)public ListNode getKthFromEnd(ListNode head, int k) { /** 两个指针,一个指向开始位置0,一个指原创 2021-11-16 21:58:07 · 362 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
和官方题解思路是一样的,但是细节上的思想不同,但也AC了关键是三个1.要将上一个结点存起来2.要有一个指针指向下一个结点3.边界问题,要注意什么时候跳出循环public ListNode reverseList(ListNode head) { /** 如果该链表为空 或者 为一个结点*/ if (head == null || head.next == null){ return head; } /**原创 2021-11-16 21:49:50 · 346 阅读 · 0 评论 -
83.从有序链表中删除重复节点
还是双指针,依次遍历 比较同样注意边界的判断条件,还有参数为空的条件public static ListNode deleteDuplicates(ListNode head) { if(head == null) { return null; } //先定义两个辅助指针 ListNode forward = head.next;//前 ListNode rear = head;//后 //开始循环判断 while(rea原创 2021-11-06 09:20:12 · 114 阅读 · 0 评论 -
206. 反转链表
https://leetcode-cn.com/problems/reverse-linked-list/solution/shi-pin-jiang-jie-die-dai-he-di-gui-hen-hswxy/定义三个辅助结点一个指向head前的null prev一个指向当前结点 curr一个指向当前结点的下一个结点 nextNode先将curr的next指向prev,然后同时将curr 和 prev 向后移动一个位置,nextNode结点的作用就在于 curr指原创 2021-10-30 09:40:05 · 63 阅读 · 0 评论 -
160. 相交链表
一.利用哈希集合先将其中一个链表添加到HashSet中,再利用contains方法查询是否有相同的结点,如果有,说明相交,没有,就证明平行缺点就是慢public static ListNode getIntersectionNode(ListNode headA, ListNode headB) { HashSet<ListNode> setAb = new HashSet<ListNode>(); ListNode temp = headA; w原创 2021-10-27 11:33:22 · 64 阅读 · 0 评论 -
121. 买卖股票的最佳时机
只要记录前面的最小价格,将这个最小价格作为买入价格,然后将当前的价格作为售出价格,查看当前收益是不是最大收益。 public static int maxProfit(int[] prices) { int price = 0; int min = prices[0]; int max = 0; for(int i = 1; i < prices.length; i++) { if(prices[i] > min) { max = Math.m原创 2021-10-22 09:37:00 · 51 阅读 · 0 评论 -
141.环形链表
1.快慢指针使用双指针,一个指针每次移动一个节点,一个指针每次移动两个节点,如果存在环,那么这两个指针一定会相遇。public boolean hasCycle(ListNode head) { if (head == null) { return false; } ListNode l1 = head, l2 = head.next; while (l1 != null && l2 != null && l2.nex原创 2021-10-16 16:36:24 · 91 阅读 · 0 评论 -
88.并两个有序数组
两种情况,一种为m等于零,就只需要将nums2中元素替换掉nums1的0;另一种就直接将num2的元素替换掉num1后面的0;然后在排序 if (m == 0 ) {//m == 0 说明m中没有元素,只有占位的0;所以只要将num2覆盖num1即可 for(int j = 0; j < nums1.length; j++) { nums1[j] = nums2[j]; } System.out.println(Arra..原创 2021-10-16 15:46:54 · 62 阅读 · 0 评论 -
680.验证回文串
双指针i,j,一个正向一个逆向,当charAt(i) 不等于char(j),就开始尝试着从i+1到j判断是否回文或者尝试着从i到j-1判断是否回文(嵌套) public boolean validPalindrome(String s) { for (int i = 0, j = s.length() - 1; i < j; i++, j--) { if (s.charAt(i) != s.charAt(j)) { ...原创 2021-10-15 11:38:00 · 54 阅读 · 0 评论 -
345.反转字符串中的元音字母
public static String reverseVowels(String s) { //先定义两个指针 int l = 0; int r = s.length()-1; //建立一个结果集 char[] reslut = new char[s.length()]; //将元音字母存放在集合中 HashSet<Character> list1 = new HashSet<Ch...原创 2021-10-14 10:21:12 · 47 阅读 · 0 评论 -
633. 两数平方和
双指针,一个从0开始,一个从后面(c的开方)开如果 i * i + j * j 大于 c 就j--如果i * i + j * j 小于 c 就i++public boolean judgeSquareSum(int c) { int i = 0; int j = (int) Math.sqrt(c);//开方 if(c == 2147483600 || c == 2147483636 || c==2147473645){...原创 2021-10-13 11:17:36 · 189 阅读 · 1 评论