LeetCodeの配列問題(一)
9917 ワード
1.正しいプログラムを書き出す方法:
2.LeetCode:283移動ゼロ
問題の説明:
配列
nums
が与えられ、非ゼロ要素の相対順序を維持しながら、関数を記述して、すべての0
をその末尾に移動する.例えば、
nums = [0, 1, 0, 3, 12]
が定義され、関数が呼び出された後、nums
は[1, 3, 12, 0, 0]
であるべきである.注意事項:
考え方:
コードディスプレイ
package algorithm.interview;
public class MoveZeroClass {
// O(n)
// O(1)
public void moveZeroes(int[] nums) {
if (nums==null||nums.length<=0) {
return;
}
int zeroNum=0;// 0
int len=nums.length;
for(int i=0;iif (nums[i]!=0)
swap(nums,i,i-zeroNum);
else
zeroNum++;
}
}
public void moveZeroes2(int[] nums) {
if (nums==null||nums.length<=0){
return;
}
int len=nums.length;
int k=0;//nums [0,k) 0
// i , [0,i] 0
//d [0,k)
for (int i=0;iif (nums[i] != 0)
nums[k++] = nums[i];
// nums 0
for (int i=k;i0;
}
public void moveZeros3(int [] nums){
int k=0;
for (int i=0;iif (nums[i]!=0)
if (i!=k)//
swap(nums[i],nums[k++],nums);
else
k++;
}
}
}
3.LeetCode :27
問題の説明
配列numsと値valを指定すると、valに等しいすべての数値の要素をその場で除去し、除去後の配列の新しい長さを返す必要があります.
余分な配列空間を使用しないでください.入力配列をその場で変更し、O(1)余分な空間を使用する条件で完了する必要があります.
要素の順序は変更できます.配列の中で新しい長さの後ろを超える要素を考慮する必要はありません.
例1:
nums = [3,2,2,3], val = 3,
2, nums 2。
。
例2:
nums = [0,1,2,2,3,0,4,2], val = 2,
5, nums 0, 1, 3, 0, 4。
。
。
考え方:
クラスは前の問題よりいいですが、この問題は特定の数で、前の問題は0で、本質は同じです.
コード#コード#
class Solution {
public int removeElement(int[] nums, int val) {
int k=0;
for (int i=0;iif (nums[i]!=val)
if (i!=k)
swap(nums,i,k++);
else
k++;
}
return k;
}
private void swap(int[] nums, int index1, int index2) {
int temp=nums[index1];
nums[index1]=nums[index2];
nums[index2]=temp;
}
}
4.LeetCode :26
問題の説明
ソート配列を指定すると、繰り返し表示される要素をその場で削除し、各要素が1回だけ表示されるようにして、削除後の配列の新しい長さを返します.
余分な配列空間を使用しないでください.入力配列をその場で変更し、O(1)余分な空間を使用する条件で完了する必要があります.
例1:
nums = [1,1,2],
2, nums 1, 2。
。
コードディスプレイ
class Solution {
public int removeDuplicates(int[] nums) {
if(nums==null||nums.length<=0)
return 0;
int n=nums.length;
int k=0;//[0,k]
for (int i=1;iif (nums[i]!=nums[k])
nums[++k]=nums[i];
}
return k+1;
}
}
5.LeetCode :80
問題の説明
ソート配列を指定すると、重複する要素をその場で削除し、各要素が最大2回表示され、削除後の配列の新しい長さを返す必要があります.
余分な配列空間を使用しないでください.入力配列をその場で変更し、O(1)余分な空間を使用する条件で完了する必要があります.
例1:
nums = [1,1,1,2,2,3],
length = 5, 1, 1, 2, 2, 3 。
。
例2:
nums = [0,0,1,1,1,1,2,3,3],
length = 7, 0, 0, 1, 1, 2, 3, 3 。
。
考え方:
次の問題は同じですが、ここにカウンターを1つつければいいだけです.
コードディスプレイ
package com.antfin.leetcode;
import com.utils.CommonUtils;
public class RemoveDuli {
public int removeDuplicates(int[] nums) {
if (nums==null||nums.length<=0)
return 0;
int k=0;//
int times=0;
for (int i=1;iif (nums[i]==nums[k]) {
times++;
if (times==1) {
nums[++k] = nums[i];//
}
}
if (nums[i]!=nums[k])//
{
nums[++k] = nums[i];
times=0;//
}
}
return k+1;
}
public static void main(String[] args) {
RemoveDuli r=new RemoveDuli();
int [] arr={0,0,1,1,1,1,2,3,3};
int i = r.removeDuplicates(arr);
System.out.println(i);
CommonUtils.printArr(arr);
}
}