Search in Rotated Sorted Array
Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.
Do not allocate extra space for another array, you must do this in place with constant memory.
思路一(不好,只是为了记录自己的思路轨迹,可忽略不看):
循环遍历链表,循环体:
1. 对于每一个A[i],下标指针j指向i 循环j++直到A[j]不等于A[i]或者到达数组末尾为止。这个时候找到了和A[i]不等的数;
2. 将j以及j之后的值依次挪动到i+1以及之后的位置。
3. i++;
这个思路仔细思考下去是可以的。但是问题就是每次都需要挪动数组,而且每次挪动后都不一定是他们最终的位置,以后还要挪动。还有个问题是循环次数很多。而且长度变化计算起来比较麻烦。
思路2:
1. 自己的脑子里面维持一个新的逻辑数组(数组里面元素是不重复的)的概念;
2. 定义下标指针 i 永远指向新的逻辑数组的尾部元素;定义下标指针 tail 永远指向这个新数组的尾部元素的下一个。因为第一个元素肯定是不重复的,所以i 初始值为0,tail 初始值为1;
3. 定义下标指针j 指向扫描到的不等于A[i]的元素下标,现在假设我们已经有了一个不重复的数组为下标范围为[0,i],则下一个位置(tail)处放的值为A[j];
4. 我们在循环过程中维持上述规定不变就可以了。
代码如下:
public int removeDuplicates(int[] A) { // Start typing your Java solution below // DO NOT write main() function if(A == null||A.length == 0) return 0; int i = 0;//永远指向逻辑新数组(存储仍然在原来数组)的尾部 int tail = i+1;//永远指向逻辑新数组(存储仍然在原来数组)的尾部的下一位 int j = i; while(j<=A.length-1){ while(j<=A.length-1&&A[j]==A[i]) j++; //达到数组长度或者找到一个不相等的值时,跳出循环 if(j<=A.length-1){ A[tail] = A[j]; i++; tail++; } } return tail; }
Search in Rotated Sorted Array II
跟上一题的思路是类似的。代码:
public int removeDuplicates(int[] A) {
// Start typing your Java solution below
// DO NOT write main() function
if(A == null||A.length == 0) return 0;
int i = 0;
int j = i;
int prevj = j;
int tail = i+1;
int len = A.length;
while(j <= len-1){
prevj = j;
while(j<=len-1&&A[j]==A[i]) j++;
//此时有A[prevj] = A[i]&&A[j]!=A[i]
if(j>prevj+1){[prevj,j]区间内有等于A[i]的值,只取一个A[j-1]
A[tail] = A[j-1];
tail++;
i++;
if(j<=len-1) {A[tail]= A[j];tail++;i++;}
}
else{//[prevj,j]区间内没有等于A[i]的值,和上题一样
if(j<=len-1) {A[tail]= A[j];tail++;i++;}
}
}
return tail;
}
同样思路解决Remove Duplicates from Sorted List
public ListNode deleteDuplicates(ListNode head) { // Start typing your Java solution below // DO NOT write main() function if(head == null) return null; ListNode i = head; ListNode j = i; ListNode tail = i.next; while(j!=null){ while(j!=null&&i.val == j.val) j = j.next; if(j!=null){ tail.val = j.val; tail = tail.next; i = i.next; } } i.next = null; return head; }
Remove Duplicates from Sorted List II
public ListNode deleteDuplicates(ListNode head) { // Start typing your Java solution below // DO NOT write main() function if(head == null) return null; ListNode j = head; ListNode tail = null;//删除后的数组尾,初始为0 ListNode i = head; while(j!=null){ i = j; while(j!=null&&i.val == j.val) j = j.next; if(j == i.next){//没有和i相同的 if(tail == null){head = i; tail = i;} else {tail.next.val = i.val;tail = tail.next;} } } if(tail!=null){ tail.next = null; return head; }else{ return null; } }
测试用例:
tail 为空的情况
[1,1]
[1,1,2,2]
tail 不为空
[1,1,2]
[1,2,2]
其他比较正常一点的情况不列出了
发现思考循环不变式非常有助于清晰思路!!!!
类似的思路有MergeTwoSortedList,partitionList
回头补充代码 嗯
相关推荐
《使用leetcode-editor在IDE中进行LeetCode练习的全方位指南》 LeetCode是一个广受欢迎的在线编程练习平台,它提供了一系列的算法题目供程序员们提升技能。对于习惯在集成开发环境(IDE)中工作的开发者来说,将...
《Python版LeetCode题解全集详解》 LeetCode是一个广受欢迎的在线编程挑战平台,致力于帮助程序员提升技能,特别是面试准备。这个压缩包“lc-all-solutions-master”包含了使用Python语言解决LeetCode所有问题的...
"IDEA leetcode-editor插件"就是将这两者结合的工具,允许用户在IDEA中直接进行LeetCode的编程挑战,无需离开开发环境,提高了刷题的便捷性。 该插件的主要功能包括: 1. **离线模式**:在无法访问LeetCode官网的...
vs code LeetCode 插件
terminal-leetcode, 终端Leetcode是基于终端的Leetcode网站查看器 终端 leetcode终端leetcode是基于终端的leetcode网站查看器。本项目是由 RTV 激发的。 我最近正在学习本地化的反应,以实践我的新知识,并根据这个...
基于Python实现的LeetCode爬虫爬取LeetCode题目描述和提交的代码.zip ## 特点 - 支持爬取题目列表,保存为本地CSV/Excel文件。 - 支持爬取题目描述,保存为本地HTML文件。 - 支持爬取用户提交的代码,保存为如_.py...
(C++)LeetCode刷题题解答案
leetcode刷题, 直接用leetcode的分类方式.
力扣(LeetCode) 相比其他编程平台有着很多优势: **各大知名公司面试真题:**对于求职者在这上面训练更具有针对性,目前国内一些公司面试时直接从在这上面出题。 **大中小企业都在使用:**常常会直接或者间接...
LeetCode-Swift, 快速LeetCode解决方案 LeetCodeLeetCode在线判断是一个包含很多收费算法的网站。 them Google Google Google Google LinkedIn this this repo 。 请免费参考并收费STAR以支持这个 repo,
LeetCode面试笔试题
《LeetCode Editor 7.4:提升编程技能的利器》 在编程学习和实践中,LeetCode 已经成为了程序员们磨炼算法、提升编程技能的重要平台。为了方便开发者更高效地进行刷题,LeetCode 提供了官方编辑器插件——LeetCode ...
算法 Leetcode刷题手册 labuladong的算法小抄官方完整版
### LeetCode中文版知识点概述 #### 一、LeetCode简介与使用 LeetCode是一个全球知名的在线编程学习平台,主要提供各种算法题目供开发者练习。它不仅涵盖了基础数据结构和算法训练,还包括了大量的面试真题,是...
leetcode题解代码,先使用C++解题,后续学习其它语言也使用leetcode来快速学习.leetcode题解代码,先使用C++解题,后续学习其它语言也使用leetcode来快速学习.leetcode题解代码,先使用C++解题,后续学习其它语言也...
LeetCode 400题目 Java版本 (LeetCode is the platform to help you enhance your skills, expand your knowledge and prepare for technical interviews.)
leetcode 习题集, leetcode 官网出品,包含基本的算法
leetcode算法。本书包含了 LeetCode Online Judge(http://leetcode.com/onlinejudge) 所有题目的答案,所有 代码经过精心编写,编码规范良好,适合读者反复揣摩,模仿,甚至在纸上默写。 全书的代码,使用 C++ 11 的...