File tree 4 files changed +114
-1
lines changed 4 files changed +114
-1
lines changed Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ public void rotate (int [] nums , int k ) {
3
+ if (k > nums .length ) {
4
+ k = k %nums .length ;
5
+ }
6
+ int [] rememberArray = new int [k ];
7
+ int j = 0 ;
8
+ for (int i = nums .length -k ; i < nums .length ; i ++) {
9
+ rememberArray [j ] = nums [i ];
10
+ j ++;
11
+ }
12
+ for (int i =nums .length -k -1 ; i >=0 ; i --) {
13
+ nums [i +k ] = nums [i ];
14
+ }
15
+ for (int i =0 ; i <k ; i ++) {
16
+ nums [i ] = rememberArray [i ];
17
+ }
18
+ }
19
+ }
Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ public int removeDuplicates (int [] nums ) {
3
+ int numbers = 0 ;
4
+ int arrayLength = nums .length ;
5
+ for (int i =0 ; i <arrayLength ; i ++) {
6
+ for (int j =i +1 ; j <arrayLength ; j ++) {
7
+ if (nums [i ]!=nums [j ]) {
8
+ numbers ++;
9
+ break ;
10
+ } else if (nums [i ] == nums [j ]){
11
+ removeElementArray (nums , j );
12
+ arrayLength = arrayLength -1 ;
13
+ j = j -1 ;
14
+ }
15
+ }
16
+ }
17
+ return numbers +1 ;
18
+ }
19
+
20
+ public void removeElementArray (int [] array , int index ) {
21
+ for (int i =index ; i <array .length -1 ; i ++) {
22
+ array [i ] = array [i +1 ];
23
+ }
24
+ }
25
+ }
Original file line number Diff line number Diff line change 1
- # 学习笔记
1
+ ## 前言
2
+
3
+ ### 题目1
4
+ [ Leetcode #26 移除数组中的重复元素] ( https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ )
5
+
6
+ ### 难点分析
7
+ > 这道题目的难点在于对空间复杂度的限制,不能使用外部辅助的数据结构,必须在原地完成这个操作。
8
+
9
+ ### 解题思路
10
+ > 首先想到先把"原地删除数组中某一个给定位置的元素"的这个方法抽象出来。由于数组对删除可添加元素并不是非常友好,这个操作的复杂度为O(n),从给定的位置index开始,每一个元素要依次等于后面的元素。这一步细节在于,由于需要有一个i+1的判断,所以i的取值上限为array.length-1。接下来的思路是明确触发这个删除操作的时机,大致的思路是,对于数组中的所有元素,用一个for循环,判断所有在它后面的元素,如果元素不相等,则将number的统计值加一,同时退出当前元素的判断。如果后面的元素和当前元素相等,就调用之前我们封装的删除特定位置的数组元素的方法,删除。这里的难点同样在于原地操作,删除后需要对原始数组有一个状态的更新。包括两部分:1.总的需要判断的数组长度减1。2.待判断元素的下表不能增加,因为已经删了一个了,所以下一个其实就是当前。
11
+
12
+ ### 参考代码AC
13
+ ``` Java
14
+ class Solution {
15
+ public int removeDuplicates (int [] nums ) {
16
+ int numbers = 0 ;
17
+ int arrayLength = nums. length;
18
+ for (int i= 0 ; i< arrayLength; i++ ) {
19
+ for (int j= i+ 1 ; j< arrayLength; j++ ) {
20
+ if (nums[i]!= nums[j]) {
21
+ numbers ++ ;
22
+ break ;
23
+ } else if (nums[i] == nums[j]){
24
+ removeElementArray(nums, j);
25
+ arrayLength = arrayLength- 1 ;
26
+ j = j- 1 ;
27
+ }
28
+ }
29
+ }
30
+ return numbers+ 1 ;
31
+ }
32
+
33
+ public void removeElementArray (int [] array , int index ) {
34
+ for (int i= index; i< array. length- 1 ; i++ ) {
35
+ array[i] = array[i+ 1 ];
36
+ }
37
+ }
38
+ }
39
+ ```
40
+
41
+ ### 题目2
42
+ [ Leetcode #189 旋转数组] ( https://leetcode-cn.com/problems/rotate-array/ )
43
+ ### 难点分析
44
+ > 这道题目的难点在于对空间复杂度的限制,不能使用外部辅助的数据结构,必须在原地完成这个操作。其次题目中的有些测试用例K可能大于数组长度,这样就需要引入取模操作。
45
+
46
+ ### 解题思路
47
+ > 解决这种数组的题目,特别是下标操作比较绕的题目,比较好的方式就是多举一些例子。我在做这道题的时候,其实一开始没有想到要求模。有些边界的情况其实可以通过多提交几次来添加。大体的思路是首先把那些需要移到右边的节点保存下来,然后从后往前把n-k个元素移到后边,最后再把空出来的那些空位用之前保存下来的那些元素补上。
48
+
49
+ ### 参考AC代码
50
+ ``` Java
51
+ class Solution {
52
+ public void rotate (int [] nums , int k ) {
53
+ if (k > nums. length) {
54
+ k = k% nums. length;
55
+ }
56
+ int [] rememberArray = new int [k];
57
+ int j = 0 ;
58
+ for (int i = nums. length- k; i< nums. length; i++ ) {
59
+ rememberArray[j] = nums[i];
60
+ j++ ;
61
+ }
62
+ for (int i= nums. length- k- 1 ; i>= 0 ; i-- ) {
63
+ nums[i+ k] = nums[i];
64
+ }
65
+ for (int i= 0 ; i< k; i++ ) {
66
+ nums[i] = rememberArray[i];
67
+ }
68
+ }
69
+ }
70
+ ```
You can’t perform that action at this time.
0 commit comments