1
+ package weekly ;
2
+
3
+ import java .util .ArrayList ;
4
+ import java .util .Arrays ;
5
+ import java .util .HashMap ;
6
+ import java .util .HashSet ;
7
+ import java .util .LinkedList ;
8
+ import java .util .List ;
9
+ import java .util .Map ;
10
+ import java .util .Queue ;
11
+ import java .util .Set ;
12
+
13
+ public class wk305 {
14
+ //ranking: 903 / 7465
15
+
16
+ //简单题,遍历即可
17
+ public int arithmeticTriplets (int [] nums , int diff ) {
18
+ int ans = 0 ;
19
+ for (int i = 0 ; i < nums .length ; i ++) {
20
+ for (int j = i + 1 ; j < nums .length ; j ++) {
21
+ for (int k = j + 1 ; k < nums .length ; k ++) {
22
+ if (nums [j ] - nums [i ] == diff && nums [k ] - nums [j ] == diff ) {
23
+ ans ++;
24
+ }
25
+ }
26
+ }
27
+ }
28
+ return ans ;
29
+ }
30
+
31
+
32
+ //中等题,bfs+限制
33
+ public int reachableNodes (int n , int [][] edges , int [] restricted ) {
34
+ Map <Integer , List <Integer >> map = new HashMap <>();
35
+ for (int [] edge : edges ) {
36
+ if (!map .containsKey (edge [0 ])) map .put (edge [0 ], new ArrayList <>());
37
+ if (!map .containsKey (edge [1 ])) map .put (edge [1 ], new ArrayList <>());
38
+ map .get (edge [0 ]).add (edge [1 ]);
39
+ map .get (edge [1 ]).add (edge [0 ]);
40
+ }
41
+
42
+ Set <Integer > set = new HashSet <>();
43
+ for (int i : restricted ) {
44
+ set .add (i );
45
+ }
46
+
47
+ Queue <Integer > queue = new LinkedList <>();
48
+ queue .add (0 );
49
+ int ans = 1 ;
50
+ boolean [] visited = new boolean [n ];
51
+ visited [0 ] = true ;
52
+
53
+ while (!queue .isEmpty ()) {
54
+ Integer poll = queue .poll ();
55
+ for (Integer next : map .getOrDefault (poll , new ArrayList <>())) {
56
+ if (visited [next ] || set .contains (next )) continue ;
57
+ visited [next ] = true ;
58
+ queue .add (next );
59
+ ans ++;
60
+ }
61
+ }
62
+ return ans ;
63
+
64
+ }
65
+
66
+ /* public boolean validPartition(int[] nums) {
67
+ memo = new int[nums.length];
68
+ return help(nums, 0);
69
+ }
70
+
71
+ int[] memo;
72
+
73
+ boolean help(int[] nums, int index) {
74
+ if (index >= nums.length) return true;
75
+
76
+ if (memo[index] != 0) {
77
+ return memo[index] == 1;
78
+ }
79
+ int end = index + 1;
80
+ boolean a = false, b = false, c = false;
81
+ if (end < nums.length && nums[index] == nums[end]) {
82
+ a = help(nums, end + 1);
83
+ }
84
+ end++;
85
+ if (end < nums.length && nums[index] == nums[index + 1] && nums[index + 1] == nums[end]) {
86
+ b = help(nums, end + 1);
87
+ }
88
+ if (end < nums.length && nums[index] + 1 == nums[index + 1] && nums[index + 1] + 1 == nums[end]) {
89
+ c = help(nums, end + 1);
90
+ }
91
+ boolean res = a | b | c;
92
+ if (res) {
93
+ memo[index] = 1;
94
+ } else {
95
+ memo[index] = -1;
96
+ }
97
+ return res;
98
+ }*/
99
+
100
+ //中等题,暴力dp,不要想什么贪心做发 - -!
101
+ public boolean validPartition (int [] nums ) {
102
+ boolean [] dp = new boolean [nums .length + 1 ];
103
+ dp [0 ] = true ;
104
+ for (int i = 0 ; i < nums .length ; i ++) {
105
+ int start = i - 1 ;
106
+ if (start < 0 ) continue ;
107
+ if (nums [start ] == nums [i ]) {//两个相同
108
+ dp [i + 1 ] |= dp [start ];
109
+ }
110
+ start --;
111
+ if (start < 0 ) continue ;
112
+ if (nums [start ] == nums [i - 1 ] && nums [start ] == nums [i ]) {//三个相同
113
+ dp [i + 1 ] |= dp [start ];
114
+ }
115
+ if (nums [start ] + 1 == nums [i - 1 ] && nums [i - 1 ] + 1 == nums [i ]) {//三个相差1
116
+ dp [i + 1 ] |= dp [start ];
117
+ }
118
+ }
119
+ return dp [nums .length ];
120
+ }
121
+
122
+ //中等题,直接一维dp
123
+ public int longestIdealString (String s , int k ) {
124
+ char [] chars = s .toCharArray ();
125
+ int [] dp = new int [s .length ()];
126
+ int [] index = new int [26 ];//记录字母的位置
127
+ Arrays .fill (index , -1 );//初试为-1都不存在
128
+ int max = 0 ;
129
+ for (int i = 0 ; i < chars .length ; i ++) {
130
+ char num = chars [i ];
131
+ dp [i ] = 1 ;
132
+ //j表示相差k的字母
133
+ for (int j = Math .max (0 , num - 'a' - k ); j <= Math .min (25 , num - 'a' + k ); j ++) {
134
+ if (index [j ] < 0 ) continue ;
135
+ //更新dp[i], 可到达的字母+1
136
+ dp [i ] = Math .max (dp [index [j ]] + 1 , dp [i ]);//
137
+ }
138
+ index [num - 'a' ] = i ;
139
+ max = Math .max (max , dp [i ]);
140
+ }
141
+ return max ;
142
+ }
143
+
144
+ //或者直接dp[26]
145
+ /* public int longestIdealString(String s, int k) {
146
+ char[] chars = s.toCharArray();
147
+ int[] dp = new int[26];
148
+ int max = 0;
149
+ for (int i = 0; i < chars.length; i++) {
150
+ char num = chars[i];
151
+ //j表示相差k的字母
152
+ for (int j = Math.max(0, num - 'a' - k); j <= Math.min(25, num - 'a' + k); j++) {
153
+ dp[num-'a'] = Math.max(dp[j], dp[num-'a']);
154
+ }
155
+ dp[num-'a'] ++;
156
+ max = Math.max(max, dp[i]);
157
+ }
158
+ return max;
159
+
160
+ }*/
161
+ }
0 commit comments