This is my solution using two indexes and a counter. Loop through the array and copy from loop index to another index that maintains the last element in the "new" array. The counter maintains how many of current value we've copied. It is reset when we encounter a new value. Can be generalized to allow any number of duplicates. Runs in O(n) time. Pretty straightforward I think.

```
public class Solution {
public int RemoveDuplicates(int[] nums) {
if(nums.Length==0) return 0;
int currIndex = 0, count = 1;
for(int i=1; i < nums.Length; i++) {
if(nums[i] != nums[currIndex]) {
nums[++currIndex] = nums[i];
count = 0; //reset counter
} else if(count < 2) { //allow 2 duplicates or change this to allow any number
nums[++currIndex] = nums[i];
}
count++;
}
return currIndex + 1;
}
}
```